JDBC数据源 使用JNDI连接池实现数据库的连接
Posted @binglong180
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC数据源 使用JNDI连接池实现数据库的连接相关的知识,希望对你有一定的参考价值。
|
0.引言
许多Web应用程序需要通过JDBC驱动程序访问数据库,以支持该应用程序所需的功能。Java EE平台规范要求Java EE应用程序服务器为此目的提供一个DataSource实现(即,用于JDBC连接的连接池)。Tomcat提供了完全相同的支持,因此使用此服务在Tomcat上开发的基于数据库的应用程序将在任何Java EE服务器上保持不变。
有关JDBC的信息,请参考以下内容:
-
http://www.oracle.com/technetwork/java/javase/jdbc/index.html - 有关Java数据库连接信息的主页。
-
http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html - JDBC 2.1 API规范。
-
http://java.sun.com/products/jdbc/jdbc20.stdext.pdf - JDBC 2.0标准扩展API(包括
javax.sql.DataSource
API)。这个包现在被称为“JDBC可选包”。 -
http://www.oracle.com/technetwork/java/javaee/overview/index.htm - Java EE平台规范(涵盖所有Java EE平台必须提供给应用程序的JDBC工具)。
注 - Tomcat中的默认数据源支持基于Commons 项目中的DBCP连接池 。然而,也可以使用实现任何其他连接池,通过编写自己的自定义资源工厂,描述 如下。javax.sql.DataSource
1.安装JDBC驱动程序
使用JDBC数据源 JNDI资源工厂要求您为Tomcat内部类和Web应用程序提供适当的JDBC驱动程序。这很容易通过将驱动程序的JAR文件安装到$CATALINA_HOME/lib
目录中来完成,这使得驱动程序既可用于资源工厂,也可用于您的应用程序。
2.声明您的资源要求
接下来,修改Web应用程序部署描述符(/WEB-INF/web.xml
)以声明JNDI名称,您将在其中查找预配置的数据源。按照惯例,所有这样的名字都应该解析为jdbc
子上下文(相对于作为java:comp/env
所有提供的资源工厂的根的标准命名上下文来说,典型的web.xml
入口可能是这样的:
<resource-ref> <description> Resource reference to a factory for java.sql.Connection instances that may be used for talking to a particular database that is configured in the <Context> configuration for the web application. </description> <res-ref-name> jdbc/EmployeeDB </res-ref-name> <res-type> javax.sql.DataSource </res-type> <res-auth> Container </res-auth> </resource-ref>
警告 - 请确保您遵守DTD为Web应用程序部署描述符所需的元素排序!有关详细信息,请参阅 Servlet规范。
3.编写你的应用程序使用这个资源
此资源引用的典型用法可能如下所示:
Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); Connection conn = ds.getConnection(); ... use this connection to access the database ... conn.close();
请注意,应用程序使用在Web应用程序部署描述符中声明的相同的资源引用名称。这与<Context>
Web应用程序的元素中配置的资源工厂相匹配, 如下所述。
4.配置Tomcat的资源工厂
要配置Tomcat的资源工厂,请将这样的元素添加到<Context>
Web应用程序的 元素中。
<Context ...> ... <Resource name="jdbc/EmployeeDB" auth="Container" type="javax.sql.DataSource" username="dbusername" password="dbpassword" driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database" maxActive="8" maxIdle="4"/> ... </Context>
请注意,资源名称(此处jdbc/EmployeeDB
)必须与Web应用程序部署描述符中指定的值相匹配。
此示例假定您正在使用HypersonicSQL数据库JDBC驱动程序。自定义driverClassName
和 driverName
参数以匹配您的实际数据库的JDBC驱动程序和连接URL。
Tomcat标准数据源资源工厂(org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory
)的配置属性如下所示:
-
driverClassName - 要使用的JDBC驱动程序的完全限定Java类名称。
-
username - 要传递给我们的JDBC驱动程序的数据库用户名。
-
password - 数据库密码被传递给我们的JDBC驱动程序。
-
url - 要传递给我们的JDBC驱动程序的连接URL。(为了向后兼容,该属性
driverName
也被认可。) -
initialSize - 池初始化期间将在池中创建的初始连接数。默认值:0
-
maxActive - 可同时从该池中分配的最大连接数。默认:8
-
minIdle - 同时在此池中闲置的最少连接数。默认值:0
-
maxIdle - 可同时在此池中闲置的最大连接数。默认:8
-
maxWait - 池在抛出异常之前等待的最大毫秒数(当没有可用的连接时)。默认值:-1(无限)
一些额外的属性处理连接验证:
-
validationQuery - SQL查询,可以在池返回到应用程序之前用于验证连接。如果指定,这个查询必须是一个返回至少一行的SQL SELECT语句。
-
validationQueryTimeout - 验证查询返回的超时秒数。默认值:-1(无限)
-
testOnBorrow - true或false:每次从池中借用验证查询是否验证连接。默认值:true
-
testOnReturn - true或false:是否每次将连接返回到池时使用验证查询验证连接。默认:false
可选的evictor线程负责通过移除任何长时间处于空闲状态的连接来缩小池。退伍军人不尊重minIdle
。请注意,如果您只希望池根据配置的maxIdle
属性收缩,则不需要激活evictor线程。
evictor在默认情况下是禁用的,可以使用以下属性进行配置:
-
timeBetweenEvictionRunsMillis - 逐出器连续运行之间的毫秒数。默认值:-1(禁用)
-
numTestsPerEvictionRun - 在逐出器的每次运行期间将由检出器检查空闲的连接数。默认:3
-
minEvictableIdleTimeMillis - 以秒为单位的空闲时间,在该时间之后,可以通过逐出器从池中删除连接。默认值:30 * 60 * 1000(30分钟)
-
testWhileIdle - true或者false:连接是否应该由evictor线程在池中闲置时使用验证查询进行验证。默认:false
另一个可选功能是删除废弃的连接。如果应用程序长时间未将其返回到池,则称该连接被放弃。游泳池可以自动关闭此类连接并将其从游泳池中移除。这是泄露连接的应用程序的解决方法。
放弃功能默认是禁用的,可以使用以下属性进行配置:
-
removeAbandoned - true或false:是否从池中删除放弃的连接。默认:false
-
removeAbandonedTimeout - 假定借用连接被放弃的秒数。默认值:300
-
logAbandoned - true或false:是否为放弃语句或连接的应用程序代码记录堆栈跟踪。这增加了严重的开销。默认:false
最后有各种属性可以进一步调整池的行为:
-
defaultAutoCommit - true或false:由此池创建的连接的默认自动提交状态。默认值:true
-
defaultReadOnly - true或false:由此池创建的连接的默认只读状态。默认:false
-
defaultTransactionIsolation - 这设置默认事务隔离级别。可以是一个
NONE
,READ_COMMITTED
,READ_UNCOMMITTED
,REPEATABLE_READ
,SERIALIZABLE
。默认:没有默认设置 -
poolPreparedStatements - true或false:是否要池PreparedStatements和CallableStatements。默认:false
-
maxOpenPreparedStatements - 可以从语句池同时分配的最大打开语句数。默认值:-1(无限制)
-
defaultCatalog - 默认目录的名称。默认:未设置
-
connectionInitSqls - 在创建连接后运行一次SQL语句。用分号(
;
)分隔多个语句。默认:没有语句 -
connectionProperties - 传递给驱动程序以创建连接的驱动程序特定属性的列表。每个属性都给定为
name=value
,多个属性用分号(;
)分隔。默认值:没有属性 -
accessToUnderlyingConnectionAllowed - true或false:是否允许访问基础连接。默认:false
以上是关于JDBC数据源 使用JNDI连接池实现数据库的连接的主要内容,如果未能解决你的问题,请参考以下文章