数据源简介JDBC2.0提供了javax.sql.DataSource的接口,负责与数据库建立连接,实际应用时不需要编写连接数据库代码,可以直接从数据源获得数据库的连接,使得应用于数据库的耦合降低。
Dataource中事先建立了多个数据库连接,这些数据库连接保持在数据库连接池中,当程序访问数据库时,只需要从连接池从取出空闲的连接,访问数据库结束,在将这些连接归还给连接池。DataSource对象由容器(Tomcat)提供,不能使用创建实例的方法来生成DataSource对象,要采用JAVA的JNDI(Java Nameing and Directory Interface,java命名和目录接口)来获得DataSource对象的引用。(另有一种说法:“其实从技术上来说,数据源连接方式是不需要目录服务的,我们同样可以通过序列化数据源对象直接访问文件系统。这点是需要明确的。”感兴趣的朋友可以试试。)JNDI是一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和唯一的名字相绑定。程序中可以通过这个名字来获得对象的引用。Tomcat把DataSource作为一种可配置的JNDI资源来处理,生成DataSource对象的工厂为org.apache.comm.ons.dbcp.BasicDataSourceFactory
在一个web应用中可以使用多种数据库连接池,可以使用hibernate的连接池,可以使用Struts自带的连接池,也可以使用下面的配置连接池的方式,大家可以试试各种连接池的效率情况!
顺便说一句,tomcat中如何使用连接池,tomcat的相关文档中就有介绍,要学着看权威的文档,因为它权威而且准确!!
拿tomcat5为例,步骤如下:
1.打开%Tomcat_Home%\conf下server.xml,在<Host></Host>中加入<Context></Context>,配置你的应用,如下:
<Context path="/demo" docBase="E:/workspace/demo/WebRoot" debug="0" reloadable="true">
<Resource
name="jdbc/myDB"
auth="Container"
type="javax.sql.DataSource"
password="lportal"
driverClassName="oracle.jdbc.driver.OracleDriver"
maxIdle="2"
maxWait="5000"
username="lportal"
url="jdbc:oracle:thin:@192.168.13.123:1521:lportal"
maxActive="50"
/>
</Context>
2.在应用的web.xml中做如下配置(没有试验,好像不配置也可以)
<wepapp>
<resource-ref>
<descryiption>DB Connection</descryiption>
<res-ref-name> jdbc/myDB</res-ref-name>
<res-type>javax.sql.DataSource </res-type>
<res-auth>Container </res-auth>
</resource-ref>
</wepapp>
其中的res-ref-name的值,与server.xml文件中配置的Resource中的name一致
3. 通过JNDI查找来得到datasource,得到connection
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/myDB");
Connection con = ds.getConnection();
4.jar包的支持,一定要把连接数据库的jar包放在%Tomcat _Home%\common\lib下,不能只放在应用的lib下,连接池是tomcat容器管理,所以tomcat进行数据库连接时只能去寻找自己的lib下的jar包们,找不到就会出错了!!~
需要注意的是:这里是拿tomcat5为例,如果在tomcat4中配置数据库连接池是另外的语法,配置的内容相同,拷贝上面的配置文件到tomcat4下是不可用的。
也可以配置全局的连接池,可为tomcat下所有的应用使用
拿tomcat5为例:
在%Tomcat_Home%\conf下server.xml中配置全局数据库连接池,配置如下:
<GlobalNamingResources>
<Resource
name="jdbc/myDB"
auth="Container"
type="javax.sql.DataSource"
password="xsfw1209"
driverClassName="oracle.jdbc.driver.OracleDriver"
maxIdle="2"
maxWait="5000"
username="xsfw1209"
url="jdbc:oracle:thin:@192.168.13.143:1521:ora9i"
maxActive="50"
/>
</GlobalNamingResources>
而在应用中,引用该连接池,配置如下:
<Context path="/bb" docBase="E:/workspace/bb/WebRoot" debug="0" reloadable="true">
<ResourceLink name="myDB"
global="jdbc/myDB"
type="javax.sql.DataSource"/>
</Context>
继续2、3、4步骤,就能够在应用中使用全局数据库连接池了!
可以参考百度文库中的文章http://wenku.baidu.com/view/f0553cd3195f312b3169a54a.html