1. JDBC的介绍。
JDBC是Java的开发者——Sun公司制定的Java数据库连接(Java Data Base Connectivity)技术的简称,是为各种常用数据库提供无缝联接的技术。在Web和Internet应用程序中的作用和ODBC在Windows系列平台应用程序中的作用类似。同时JDBC和ODBC也可以称之为数据连接中间件,现在JDBC被融合在J2EE的框架中,简化了J2EE框架下应用开发过程中对数据库的调用和移植。JDBC对于现在主流的数据库都可以支持,例如:MySQL、PostgreSQL(两个开源产品)和DB2、Oracle、SQL Server、Sybase(商业化产品)等。
使用JDBC来完成对数据库的访问包括以下四个主要组件:Java或J2EE的应用程序、JDBC驱动管理器、JDBC驱动程序(以jar为后缀的Java类库)和数据源。SUN公司在设计JDBC时只定义了统一标准的SQL数据存取接口。程序员开发应用时,只需要按照标准的接口访问数据,而不需要关心后台的数据库由谁提供,从而屏蔽了数据库的差异性,减少了应用与数据库的藕合,增强了应用本身的可扩展性和可移植性。提供这种可移植性的正是JDBC的驱动程序,这个部分一般由DBMS厂商提供,应用软件只需要将提供的JAR包加载到系统中就可以实现对该数据库访问的支持。
Apusic V4.0.3不仅提供了JDBC的支持,还提供了对最新规范JDBC 3.0的支持,从而为JDBC开发中数据库连接提供了连接池管理。只需要在JNDI中配置JDBC连接,就可以自动享受连接池管理带来的好处,避免在应用中通过JDBC直接访问时因为创建和关闭连接带来的资源消耗。同时,还为数据库连接提供了自动检测与失效恢复技术,当程序代码中使用连接后没有返回给连接池,系统会检测到这样的失误并自动完成连接回收工作,从而避免了软件开发中的失误,增强了应用的健壮性。
2. JDBC的使用。
JDBC的使用主要有三种:直接通过JDBC与数据库连接;客户端远程通过iiop协议由Apusic应用服务器的JNDI->JDBC与数据库连接;Apusic应用服务器端直接通过JNDI->JDBC与数据库连接。
2.1. 直接通过JDBC与数据库连接。
这种连接方式无论是在客户端还是服务器端撰写的方式都一样,我这里兴个连接Oracle数据库的例子:
Class.forName("oracle.jdbc.driver.OracleDriver");//Oracle的加载JDBC驱动程序的方法
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL",ID,Pwd);
// 与Oracle数据库建立连接的方法。使用的是Oracle在JDBC中的连接串。
// 前面两行代码仍然与数据库有绑定关系,不同数据库的加载类不同,数据库连接串也会不同。
// 如果大家需要了解其他数据库的情况,可以在网上搜索“JDBC使用过程”或者“常用数据库JDBC连接写法”可得。
Connection.createStatement();
// 创建一个Statement对象。Statement对象执行一个查询并从DBMS返回一个包含响应结果的ResultSet对象。
// 除了Statement对象外,还有其他对象这里不再介绍,大家可以搜索“使用JDBC访问数据库”或者“JDBC优化”可得。
con.close(); // 关闭数据库连接!这个必须要做,否则数据库连接资源会在一次次打开中耗尽。
2.2. 客户端通过iiop协议由JNDI->JDBC与数据库连接。
这种方式程序就会享受到使用数据库连接池的好处,程序会减少创建和关闭数据库连接时消耗的时间。但是,我只觉得应该是客户端程序中才这样使用,因为服务器端会有更加简单的使用方式,而且代码中还存在与应用服务器绑定的问题,如何绑定的我将在Apusic中使用的例子说明:
Hashtable env=new Hashtable();
Context initCtx=null;
DataSource datasource=null;
try{
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.apusic.naming.jndi.CNContextFactory");
// JNDI的上下文工厂类,不同的应用服务器这里不同。
// WEBLOGIC是weblogic.jndi.WLInitialContextFactory可以通过查看那些产品的相关类可知。
env.put(Context.PROVIDER_URL,"iiop://APUSIC_ADDRESS:6888");
// 连接所用的协议与端口,也与应用服务器有关,WEBLOGIC就是T3.
// 以上与服务器相关的信息包括下面的部分最好都采用XML定义的方式,以便未来容易配置。
//插入相关验证信息
env.put(Context.SECURITY_CREDENTIALS,"your_username" ) ;
env.put(Context.SECURITY_PRINCIPAL,"your_password");
initCtx=new InitialContext(env);
//通过RMI 取得数据库连接
datasource=(DataSource)initCtx.lookup("jdbc/sample")
Connection conn=datasource.getConnection();
}catch(Exception e){
e.printStackTrace();
}
这样的连接在部署时还需注意为相应的连接设置用户认证标记,在APUSIC_HOME/config/datasources.xml 中添加<remote-acl>标记及其元素。范例如下:
<remote-acl>
<user>username</user>
</remote-acl>
或
<remote-acl>
<group>groupname</group>
</remote-acl>
2.3. 服务器端直接通过资源管理器(数据库连接池)->JNDI->JDBC与数据库连接。
这种方式是JDBC 3.0规范中要求的,因此所有的应用服务器都遵守同样的标准,代码中不会存在与服务器绑定的信息。系统移植时最主要是修改配置信息,这个我在后面会具体介绍,下面是使用的例子:
try{
//取得InitialContext 对象
Context ctx=new InitialContext();
//通过JNDI 取得数据源
DataSource datasource=(DataSource)
ctx.lookup("java:comp/env/jdbc/oracle");
//通过数据源取得数据库连接
Connection conn=datasource.getConnection();
...
}
这段代码不做任何修改就可以在任何标准的应用服务器上运行,大家肯定注意到了代码中有个JNDI连接串,但没有建议采用XML文件配置,如果两个应用编写了同样的JNDI串是否会发生冲突?不会,原因是将会在后面的配置中通过名称映射来解决冲突。
如果采用这种技术访问JDBC,除了需要通过JNDI注册JDBC信息外,还需要在应用的apusic-application.xml 和web.xml 文件中对“资源引用”进行定义。对于移植的应用最好的定义方法是用Apusic部署工具打开编写的应用,然后展开使用这个JDBC连接的WEB或者EJB模块,选中“资源引用”就可以添加。其中“资源引用名称”就是在代码中使用的名称“jdbc/oracle”,JNDI名称就是在应用服务器上为JDBC连接配置的JNDI名称。通过这样的映射就完成了代码与应用服务器的JNDI名称的关联,也避免了应用中重复使用JNDI名称而造成的冲突,影响到的配置参数主要是<res-ref-name>相关的部分。
3. 如何配置JDBC。
Apusic应用服务器的JDBC配置有两种方式。一种是通过http://localhost:6888/admin进入管理界面,然后对数据源直接进行配置;另一种就是用编辑器打开datasources.xml文件手工配置。配置之前先准备好数据库连接串,数据库驱动类,用户名/密码和数据库驱动程序(JAR包)。JAR包有两种载入方式,一种是拷入到APUSIC_HOME/lib目录下,在系统启动时一起载入;另一种是配置过程中将驱动程序载入,采用何种方式可以由系统管理员决定,但是这个都与系统的ClassLoader有关,感兴趣的朋友可以去网上搜索一下。