1、数据库连接池
数据库连接池的目的是避免频繁连接的开销,对提升性能是木有意义的。
2、Tomcat JNDI文档部分翻译(待补全)
选自Tomcat8.5 JNDI文档
JDBC Data Sources
0.介绍
许多web应用需要通过jdbc驱动连接数据库,来支持程序上的需求。Java EE平台规范要求Java EE应用服务器提供一个数据源实现(即JDBC连接的连接池)。Tomcat也恰好提供了相同的支持,因此在Tomcat上数据库依赖的应用将会无差别替换到Java EE服务器上。了解更多信息可参考下面的网站。
- http://www.oracle.com/technetwork/java/javase/jdbc/index.html-Java关于Java数据库连接性的主页。
- http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html - JDBC2.1 API标准。
- http://java.sun.com/products/jdbc/jdbc20.stdext.pdf - JDBC 2.0标准扩展API (including the javax.sql.DataSource
- http://www.oracle.com/technetwork/java/javaee/overview/index.htm- Java EE平台规范(包括所有Java EE平台必须提供给应用的JDBC 设施 )
注意:默认的Tomcat支持的数据资源是基于 Commons 项目的 DBCP 连接池的。然鹅我们可以添加任何的连接池,只要他是 javax.sql.DataSource的实现,通过像下面的资源工厂定义一样。
1.安装你的JDBC驱动
$CATALINA_HOME/lib目录下这样能够让资源工厂和应用都能够使用。
2.声明您的资源请求
/WEB-INF/web.xml)文件以声明JNDI名称,在该名称下您将查找预配置的数据源。把整按照惯例,所有的名称会被解析为 jdbc subcontext,和标准 java:comp/env
<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>
注意 - 你需要明确遵守web.xml文件的DTD描述的元素顺序。详情 参照 Servlet Specification 。
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.xml生命的的同一个资源参照。这与在Web应用程序的<Context>元素中配置的资源工厂相匹配,如下所述。
4.配置你的Tomcat资源工厂
为了配置Tomcat的资源工厂, 需要将这样的元素添加到Web应用程序的<Context>元素中。
<Context ...> ... <Resource name="jdbc/EmployeeDB" auth="Container" type="javax.sql.DataSource" username="dbusername" password="dbpassword" driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database" maxTotal="8" maxIdle="4"/> ...</Context>
注意资源名称 (这里是, jdbc/EmployeeDB)必须与web.xml的值完全匹配。下面的例子假定你正在使用HypersonicSQL 数据库JDBC驱动,自定义你的 driverClassName(驱动类名) 和 driverName
org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFact
ory)如下
- driverClassName
- username
- password
- url
- initialSize
- maxTotal
- minIdle
- maxIdle
- maxWaitMillis
一些
其他的属性用于处理连接验证:
- validationQuery
- validationQueryTimeout
- testOnBorrow
- testOnReturn
minIdle 参数。请注意,如果您只希望根据配置的 maxIdle属性缩小池,则不需要激活evictor线程。
逐出器(evictor )默认是不可用的他可以被以下的属性配置:
- timeBetweenEvictionRunsMillis
- numTestsPerEvictionRun
- minEvictableIdleTimeMillis
- testWhileIdle
另一个可选功能是删除废弃的连接。如果应用程序长时间未将其返回到池,则称该连接被放弃。数据库连接池可以自动关闭此类连接并将其从数据库连接池中移除. 这是应用程序连接溢出时的解决办法。放弃功能默认是禁用的,可以使用以下属性进行配置:
- removeAbandoned
- removeAbandonedTimeout
- logAbandoned
最后有各种属性可以进一步调整池的行为:
- defaultAutoCommit
- defaultReadOnly
- defaultTransactionIsolation
- poolPreparedStatements
- maxOpenPreparedStatements
- defaultCatalog
- connectionInitSqls
- connectionProperties
- accessToUnderlyingConnectionAllowed
有关更多详细信息,请参阅commons-dbcp文档。
3、多种数据库连接池
Java系的数据库连接池有多种,下面是数据库连接池测评。
https://www.tuicool.com/articles/qayayiM
4、安装数据库连接池步骤(以阿里 druid为例)
4.1 在如图所示的左侧的Eclipse 的Tomcat Server 配置出进行配置,配置context.xml 相当于tomcat服务器中的 Tomcat_HOME/conf/context.xml
<Resource
name="jdbc/druid-test"
factory="com.alibaba.druid.pool.DruidDataSourceFactory"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc url "
username="root"
password=""
/>
4.2 在WEB_INF下的web.xml(项目中)进行配置配置如右图。
<resource-ref>
<description>MySQL DB Connection</description>
<res-ref-name>jdbc/druid-test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
4.3 将druid的jar包放到WEB_INF/lib下 Tomcat中放到TOMCAT_HOME/lib中
http://central.maven.org/maven2/com/alibaba/druid/1.1.5/druid-1.1.5.jar
我在安装Tomcat 的数据库连接池是