【symfoware OPEN】数据库应用开发

Symfoware  OPEN系

- 导入方法、连接形式、执行方法

JDBC(Java DataBase Connectivity)是Java与数据库的接口规范,JDBC定义了一个支持标准SQL功能的通用低层的应用程序编程接口(API),它由Java 语言编写的类和接口组成,旨在让各数据库开发商为Java程序员提供标准的数据库API。

ODBC(Open DataBase Connectivity)是微软倡导的、当前被业界广泛接受的、用于数据库访问的应用程序编程接口(API),它以X/Open和 ISO/IEC的调用级接口(CLI)规范为基础,并使用结构化查询语言(SQL)作为其数据库访问语言。

JDBC/ODBC总体结构有四个组件:
应用程序,驱动程序管理器,驱动程序,数据源。

JDBC驱动程序管理器是内置的,驱动程序本身也可通过Web浏览器自动下载,无须安装、配置;而ODBC驱动程序管理器和ODBC驱动程序必须在每台客户机上分别安装、配置。

Java程序连接数据库的方式有三种方式:OCI方式、thin方式和JdbcOdbc桥方式:
OCI方式:
应用程序---JDBC API---驱动程序---数据源
Thin方式:
thin方式是纯java实现tcp/ip的通讯,而oci方式,客户端通过native java method调用c library访问服务端,而这个c library就是oci(oracle called interface),因此这个oci总是需要随着oracle客户端安装
JdbcOdbc桥方式(用于windows平台):
应用程序--->JDBC API--->JDBC-ODBC--->ODBC API--->ODBC层--->数据源

ADO.NET Data Providers是一组提供访问指定数据源的基本类库。
Provider              API前缀     数据源描述
ODBC Data Provider    Odbc        提供ODBC接口的数据源。一般是比较老的数据库。
OleDb Data Provider   OleDb       提供OleDb接口的数据源,比如Access或Excel。
Oracle Data Provider  Oracle      Oracle数据库
SQL Data Provider     Sql         Microsoft SQL Server数据库
Borland Data Provider Bdp         通用的访问方式能访问许多数据库,比如Interbase、SQL
                                  Server、IBM DB2和Oracle。
这些数据库连接方式ODBC,DAO,RDO,OLE DB,ADO,ADO.NET都是基于oracle客户端(oracle OCI),中间通过SQL*Net与数据库通信。如果为了追求性能,可以自己开发最适合自己数据库连接方式。             

libpq 是 PostgreSQL的 C 应用程序员的接口. libpq 是一套允许客户程序向 PostgreSQL 后端服务进程发送查询 并且获得查询返回的库过程. libpq 同时也是其他几个 PostgreSQL 应用接口下面的引擎, 包括 libpq++ (C++), libpgtcl(Tcl),Perl,和 ecpg.

参考:http://blog.csdn.net/wyzxg/article/details/5949424

【JDBC】

开发环境
setup
1、环境设置
设置CLASSPAT
jdbc:postgresql-jdbc4.jar

2、设置语言
java -Duser.language=en TestClass1

3、使用ssl加密(默认情况下SSL使用参数为false)
例:
1)
String url = "jdbc:postgresql://sv1/test";
Properties props = new Properties();
props.setProperty("user","symfo");
props.setProperty("password","secret");
props.setProperty("ssl","true");
Connection conn = DriverManager.getConnection(url, props);

2)
String url = "jdbc:postgresql://sv1/test?user=symfo&password=secret&ssl=true";
Connection conn = DriverManager.getConnection(url);

数据库连接
1、使用DriverManager
1)指定org.postgresql.Driver
2)连接字符串:
jdbc:postgresql://host:port/database?
user=user&password=password1&loginTimeout=loginTimeout&socketTimeout=socketTimeout
选项:
1)host         host;
2)port         端口号,默认为26500;
3)database   数据库名称;
4)user    用户名,默认为运行程序的用户;
5)password   密码;
6)loginTimeout  连接时超时:0~9223372036854775 (秒),指定0,或者不指定表示无限制;
7)socketTimeout  通信超时:0~2147483647(秒),指定0,或者不指定表示无限制。

连接示例:
import java.sql.*;

Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://sv1:26500/mydb?
user=myuser&password=myuser01&loginTimeout=20&socketTimeout=20";
Connection con = DriverManager.getConnection(url);

使用示例:
public String fetchFileByBytes(String path) { 
  String sql = "select * from blob_table"; 
  Connection conn = null; 
  PreparedStatement ps = null; 
  ResultSet rs = null; 
  File file = null;
  OutputStream fos = null; 

  try { 
    conn = Util.getConn();
    ps = conn.prepareStatement(sql);
    rs = ps.executeQuery();
    byte[] buffer = null;
    file = new File(path);
    fos = new FileOutputStream(file);
    while (rs.next()) {
    buffer = rs.getBytes("file");
    fos.write(buffer);
    }
    fos.flush();
    fos.close();
  } catch (SQLException e) { 
    e.printStackTrace(); 
    return null; 
  } catch (IOException e) { 
    e.printStackTrace(); 
  } finally { 
    Util.close(null, ps, conn); 
  } 
  return null; 
}
参考:http://blog.csdn.net/no_cross_no_crown/article/details/6098222


2、使用PGPoolingDataSource
选项:
1)setDataSourceName   设置数据源名称,存在多个数据源是,名称必须唯一;
2)setServerName       host;
3)setPortNumber       端口号,默认为26500;
4)setDatabaseName  数据库名称;
5)setUser    用户名,默认为运行程序的用户;
6)setPassword   密码;
7)setLoginTimeout  连接时超时:0~9223372036854775 (秒),指定0,或者不指定表示无限制;
8)setSocketTimeout  通信超时:0~2147483647(秒),指定0,或者不指定表示无限制。

示例:
import java.sql.*;
import org.postgresql.ds.PGPoolingDataSource;

PGPoolingDataSource source = new PGPoolingDataSource();
source.setDataSourceName("jdbc/ds1");
source.setServerName("sv1");
source.setPortNumber(26500);
source.setDatabaseName("mydb");
source.setUser("myuser");
source.setPassword("myuser01");
source.setLoginTimeout(20);
source.setSocketTimeout(20);

Connection con = source.getConnection();

参考:
http://i-am-birdman.iteye.com/blog/821743

3、使用PGConnectionPoolDataSourc
选项:
同PGPoolingDataSource。

示例:
import java.sql.*;
import org.postgresql.ds.PGConnectionPoolDataSource;

PGConnectionPoolDataSource source = new PGConnectionPoolDataSource();
source.setServerName("sv1");
source.setPortNumber(26500);
source.setDatabaseName("mydb");
source.setUser("myuser");
source.setPassword("myuser01");
source.setLoginTimeout(20);
source.setSocketTimeout(20);

Connection con = source.getConnection();

4、使用PGXADataSourc
选项:
同PGPoolingDataSource。

示例:
import java.sql.*;
import org.postgresql.xa. ;

PGXADataSource source = new PGXADataSource();
source.setServerName("sv1");
source.setPortNumber(26500);
source.setDatabaseName("mydb");
source.setUser("myuser");
source.setPassword("myuser01");
source.setLoginTimeout(20);
source.setSocketTimeout(20);

Connection con = source.getConnection();

小结
DriverManager与DataSource

DriverManager传统的jdbc连接,通过Class.forName("XXX"),的办法注册之后,就可以DriverManager.getConnection()获得连接了。

DataSource是建立在JNDI服务基础上的,需要application server配置datasource.首先需要注册一个DataSource(一般在/META-INF/context.xml下)然后在web.xml文件中引用这个DataSource,就可以DataSource.getConnection()获得连接。
如:
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/openbase");

DataSource如果在JNDI中注册了数据源对象,将会比起使用DriverManager来具有两个方面的优势:
1、程序不需要像使用DriverManager一样对加载的数据库驱动程序信息进行硬编码,程序员可以选择先在JNDI中注册这个数据源对象,然后在程序中使用一个逻辑名称来引用它,JNDI会自动根据你给出的名称找到与这个名称绑定的DataSource对象。然后就可以使用这个DataSource对象来建立和具体数据库的连接了。

2、使用实现了DataSource接口的类所具有的第二个优势体现在连接池和分布式事务上。连接池通过对连接的复用而不是新建一个物理连接来显著地提高程序的效率。从而适用于任务繁忙、负担繁重的企业级分布式事务。

连接池:
在多层结构的应用程序中通过连接池(connection pooling)技术可以使系统的性能明显得到提到,连接池意味着当应用程序需要调用一个数据库连接的时,数据库相关的接口通过返回一个通过重用数据库连接来代替重新创建一个数据库连接。通过这种方式,应用程序可以减少对数据库连接操作,尤其在多层环境中多个客户端可以通过共享少量的物理数据库连接来满足系统需求。通过连接池技术Java应用程序不仅可以提高系统性能同时也为系统提高了可测量性。

数据库连接池是运行在后台的而且应用程序的编码没有任何的影响。此中状况存在的前提是应用程序必须通过DataSource对象(一个实现javax.sql.DataSource接口的实例)的方式代替原有通过DriverManager类来获得数据库连接的方式。一个实现javax.sql.DataSource接口的类可以支持也可以不支持数据库连接池,但是两者获得数据库连接的代码基本是相同的。

参考:
http://tobylxy.iteye.com/blog/1673421(DriverManager与DataSource的区别以及JDBC测试代码)
http://www.iteye.com/problems/77185
http://blog.sina.com.cn/s/blog_4e57731f0100bfsj.html

【ODBC】(以linux系统为例)
安装驱动:

Linux系统下安装ODBC驱动
1、安装unixODBC;
2、编辑unixODBC的odbcinst.ini,odbcinst.ini文件在unixODBC安装目录/etc/odbcinst.ini;
设置:

1)驱动程序名称
(32位)
如果文字编码是EUC_JP或Shift-JIS,PsqlODBC选择“Symfoware ServerV12.0ansi”;
如果文字编码是UTF-8,PsqlODBC选择“Symfoware ServerV12.0unicode”。
(64位)
如果文字编码是EUC_JP或Shift-JIS,PsqlODBC选择“Symfoware ServerV12.0x64ansi”;
如果文字编码是UTF-8,PsqlODBC选择“Symfoware ServerV12.0x64unicode”。

2)Description
ODBC驱动说明
3)Driver
(32)驱动Path,文字编码为EUC_JP或者Shift-JIS时,Path=/opt/symfoclient32/odbc/lib/psqlodbca.so;
(32)驱动Path,文字编码为UTF-8时,Path=/opt/symfoclient32/odbc/lib/psqlodbcw.so;

4)Driver64
(64)驱动Path,文字编码为EUC_JP或者Shift-JIS时,Path=/opt/symfoclient64/odbc/lib/psqlodbca.so;
(64)驱动Path,文字编码为UTF-8时,Path=/opt/symfoclient64/odbc/lib/psqlodbcw.so;

5)FileUsage:指定为1;

6)Threading:指定为2。

示例
32位LinuxODBC驱动设定
[SymfowareServerV12.0unicode]
Description = Symfoware Server V12.0 unicode driver
Driver = /opt/symfoclient32/odbc/lib/psqlodbcw.so
FileUsage = 1
Threading = 2

注册数据源:
1、注册数据源
在odbc.ini文件中定义数据源,安装目录(unixODBC)/etc/odbc.ini。
选项:
1)数据源名称;
2)Description 说明;
3)Driver    选择与驱动名相同对应的设置,不要改变它的值;
4)Database   指定数据库
5)Servername  host
6)Username  连接用户
7)Password  密码
8)Port   端口
9)SSLmode  加密方式 disable:不使用SSL连接;
      allow:使用SSL连接;
      prefer:连接时优先使用SSL;
      require:必须使用SSL连接。
10)ReadOnly  指定连接是否为只读 1:只读;2:不是只读。

示例:(32位Linux)
[MyDataSource]
Description = SymfowareServer
Driver = SymfowareServerV12.0ansi
Database = db01
Servername = sv1
UserName = symfo
Password = secret
Port = 26500
ReadOnly = No

2、设置环境变量
设置:LD_LIBRARY_PATH
(32位linux bash)
LD_LIBRARY_PATH=/usr/local/lib(※):/opt/symfoclient32/lib:$LD_LIBRARY_PATH;export
LD_LIBRARY_PATH

应用开发

示例:
Linux 32位
gcc -m32 -I /usr/local/include -L /usr/lib(※) -l odbc testproc.c -o testproc

Linux 64位
gcc -m64 -I /usr/local/include -L /usr/lib64(※) -l odbc testproc.c -o testproc

-m32:32位应用程序;
-m64:64位应用程序;
-I:unixODBC驱动安装目录;
-L:unixODBC库所在目录;

注意:(※)表示示例;要使用unixODBC,指定必要的路径。

参考:
http://jingyan.baidu.com/article/8065f87f38b31423312498e4.html(mysql)
http://www.xz7.com/article/18905_1.html

连接数据库(mysql)
string constr = "Dsn=ODBCforMysql";
OdbcConnection conn = new OdbcConnection(constr);
conn.Open();
string sqlstr = "select * from tools.zhanghao";
OdbcCommand cmd = new OdbcCommand(sqlstr, conn);
OdbcDataReader reader = cmd.ExecuteReader();
while (reader.Read()){
 Console.Write(reader.GetString(0) + ", ");
 Console.Write(reader.GetString(1) + ", ");
}
conn.Close();
Console.Read();

参考:
http://jingyan.baidu.com/article/60ccbceb018f4d64cab19787.html

【.NET Data Provider】
setup
Visual Studio(Visual Studio 2010)追加Fujitsu Npgsql .Net Data Provider;
1、Windows程序:【Project】菜单选择【追加选项】,
  Web程序:【Web site】菜单选择【追加选项】;
2、【.NET】Tab【Component】添加Fujitsu Npgsql .Net Data Provider,点击【OK】。

安装アドオン
安装后可以使用TableAdapter,以Npgsql Development Tools for .NET提供。
pgx_ndtregister.exe需要使用管理员权限运行,路径:安装目录\DOTNET\BIN\。
32位アドオン注册:
> pgx_ndtregister.exe -x86

连接数据库
选项:
Server   host;
Port    端口号,默认为26500;
Database   连接数据库名;
User Id   登陆用户名;
Password   登录密码;
Timeout   连接超时时间0~1024(秒),0表示无限制,默认为15秒;
CommandTimeout  通信超时时间0~2147483647(秒),0或负数表示无限制,默认20秒。
。。。

1、使用NpgsqlConnection
using Npgsql;
NpgsqlConnection conn = new NpgsqlConnection("Server=sv1;Port=26500;Database=mydb; User
Id=myuser;Password=myuser01; Timeout=20;CommandTimeout=20;");

2、使用NpgsqlConnectionStringBuilder
using Npgsql;
NpgsqlConnectionStringBuilder sb = new NpgsqlConnectionStringBuilder();
sb.Host = "sv1";
sb.Port = 26500;
sb.Database = "mydb";
sb.UserName = "myuser";
sb.Password = "myuser01";
sb.Timeout = 20;
sb.CommandTimeout = 20;
NpgsqlConnection conn = new NpgsqlConnection(sb.ConnectionString);

3、使用ProviderFactory
using System.Data.Common;
DbProviderFactory factory = DbProviderFactories.GetFactory("Npgsql");
DbConnection conn = factory.CreateConnection();
conn.ConnectionString = "Server=sv1;Port=26500;Database=mydb; User Id=myuser;Password=myuser01;
Timeout=20;CommandTimeout=20;";


【libpq】
libpq是PostgreSQL的C应用程序员的接口.libpq是一套允许客户程序向PostgreSQL后端服务进程发送查询并且获得查询返回的库过程.libpq同时也是其他几个PostgreSQL应用接口下面的引擎,包括libpq++(C++),libpgtcl(Tcl),Perl,和ecpg。

安装:
libpq,它与PostgreSQL源码树绑定在一起。如果安装数据库系统时使用的是二进制文件而不是从源码编译安装,libpq可被单独安装,但也要记得需要使用选项-dev package。

编译:
在C程序文件中,包含libpq-fe.h头文件并在编译时添加相应的链接标记-lpq。

连接数据库:
选项:
host     主机;
hostaddr    主机IP地址;
port     主机服务器的端口号;
dbname     数据库名;
user     连接用户名;
password    密码;
connect_timeout  给连接过程设置的时间范围,以秒计。零或者不设置表示无穷;
options     发给后端的跟踪/调试选项;
tty     文件或控制台(tty),用于从后端的可选调试输出;
requiressl    设为‘1‘要求与后端进行SSL联接,设置为‘0‘(缺省)与服务器进行协商。

(使用hostaddr取代host可以让应用避免一次主机名查找,这一点对于那些有时间约束的应用来说可能是非常重要的。不过,Kerberos认证系统要求主机(host)名。);

1、PQconnectdb与后端数据库服务器建立一个新的联接.
  PGconn *PQconnectdb(const char *conninfo)

这个过程用从一个字符串conninfo来的参数与数据库打开一个新的联接.与下面的PQsetdbLogin()不同的是,我们可以不必更换函数签名(名字)就可以扩展参数集,所以我们建议应用程序中使用这个函数或者是它的非阻塞的相似函数PQconnectStart和PQconnectPoll,传入的参数可以为空,表明使用所有缺省的参数,或者可以包含一个或更多个用空白间隔的参数设置。

2、PQsetdbLogin与后端数据库服务器建立一个新的联接。这个函数是PQconnectdb前身,它有固定个数的参数,但是有相同的功能。

3、PQsetdb与后端数据库服务器建立一个新的联接。这是一个调用PQsetdbLogin()的宏,只是login和pwd参数用空(null )代替,提供这个函数主要是为了与老版本的程序兼容。

4、PQconnectStart, PQconnectPoll 与数据库服务器建立一次非阻塞的联接。
  PGconn *PQconnectStart(const char *conninfo)
  PostgreSQLPollingStatusType PQconnectPoll(PGconn *conn)

这两个过程用于打开一个与数据库服务器之间的非阻塞的联接,应用的执行线索在执行它的时候不会因远端的I/O而阻塞,不过有一些条件:
1)必须正确提供hostaddr和host参数以确保不会发生正向或者反向的名字查找;
2)如果你调用了PQtrace,确保跟踪进入的流对象不会阻塞;
3)你必须在调用PQconnectPoll之前确保socket处于正确的状态。

开始联接,调用conn=PQconnectStart("connection_info_string"),如果conn是NULL,表明libpq无法分配一个新的PGconn结构。否则,返回一个有效的PGconn指针。PQconnectStart一返回,调用status=PQstatus(conn)。如果status等于CONNECTION_BAD,PQconnectStart失败。

5、PQconndefaults返回缺省的联接选项。返回联接选项结构的地址。

6、PQfinish关闭与后端的联接,同时释放被PGconn对象使用的存储器。
  void PQfinish(PGconn *conn)

注意:即使与后端的联接尝试失败(可由PQstatus判断),应用也要调用PQfinish释放被PGconn对象使用的存储器,不应该在调用PQfinish后再使用PGconn指针。

7、PQreset重置与后端的通讯端口。
  void PQreset(PGconn *conn)

8、PQresetStart PQresetPoll以非阻塞模式重置与后端的通讯端口。
  int PQresetStart(PGconn *conn);
  PostgreSQLPollingStatusType PQresetPoll(PGconn *conn);
此函数将关闭与后端的联接并且试图与同一个服务器重建新的联接,使用所有前面使用过的参数。如果它返回 0,那么重置失败。如果返回1,用与使用PQconnectPoll建立联接的同样的方法使用PQresetPoll重置联接。

9、PQdb返回联接的数据库名。
  char *PQdb(const PGconn *conn)
 申明为const类型,这个值在PGconn对象的生存期内是固定的(下同)。

10、PQuser返回联接的用户名。
char *PQuser(const PGconn *conn)

11、PQpass返回联接的口令。
char *PQpass(const PGconn *conn)

12、PQhost返回联接的服务器主机名。
char *PQhost(const PGconn *conn)

13、PQport返回联接的端口号。
char *PQport(const PGconn *conn)

14、PQtty返回联接的调试控制台(tty)。
char *PQtty(const PGconn *conn)

15、PQoptions返回联接中使用的后端选项。
char *PQoptions(const PGconn *conn)

16、PQstatus返回联接的状态。
ConnStatusType PQstatus(const PGconn *conn)

17、PQerrorMessage返回联接中操作产生的最近的错误信息。
char *PQerrorMessage(const PGconn* conn);

18、PQbackendPID返回控制此联接的后端服务器的进程号ID。
int PQbackendPID(const PGconn *conn);

19、PQgetssl返回联接使用的SSL结构,或者如果SSL没有使用的话返回NULL。
SSL *PQgetssl(const PGconn *conn);

示例:
#include <stdio.h> 
#include <libpq-fe.h>

int main(int argc,char* argv[]){
 const char *conninfo;
 PGconn *conn;
 if (argc > 1)
     conninfo = argcv[1];
 else
 {
     printf("Not enough arguments, exiting...");
     return 1;
 }
    conn = PQconnectdb(conninfo);
    /*Check to see how I did */
    if(PQstatus(conn) == CONNECTION_OK)
        printf("Connection succeeded.\n");
    else
    {
        printf("Connection failed.\n");
    }
}
编译后运行:
$ testlibpg "hostaddr=127.0.0.1 user=postgres dbname=testdb1"
如果成功显示:“Connection succeeded.”。

其他示例程序:
http://www1.phpchina.com/resource/manual/PostgreSQL/libpq-example.html

参考:
http://tanhp.com/index.php/archives/208/
http://www1.phpchina.com/resource/manual/PostgreSQL/libpq.html#LIBPQ-INTRO
http://blog.csdn.net/freeboy1015/article/details/9307993

本文出自 “暗夜” 博客,请务必保留此出处http://icyore.blog.51cto.com/8486958/1596297

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。