什么是数据库连接池?怎么配置tomcat的数据库连接池?

来源:互联网 发布:自然语言处理余弦算法 编辑:程序博客网 时间:2024/05/29 17:59

怎么设置数据库连接池?

数据连接池的简介:

背景:数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。

数据库连接池的优势:

1:连接池一般比直接连接更有优越性(它提高了性能的同时还保存了 宝贵的资源)

2:数据库池连接只在服务器启动时打开一次,执行其他数据库语句时就不会重新打开连接。

3:数据库连接池的密码账号数据库能被共享,从而增强了系统的安全性和可管理性。

第一步:

copy(复制)数据库连接的jar包到Tomcat的lib文件夹中

第二步:

找到tomcat 里面的conf文件夹
进入context.xml

吧下面

<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"/>

标签属性解释,注:

driverClassName——完全限定Java类名 要使用的JDBC驱动程序。(也就是普通连接里面DBHelper里面的driverClassName属性值)

username——数据库用户名传递给我们 JDBC驱动程序。

password——数据库密码传递给我们 JDBC驱动程序。

url——连接URL传递给我们的JDBC驱动程序。 (向后兼容性,该财产driverName也是公认的。也就是普通连接里面DBHelper里面的url属性值)

initialSize——最初的连接数 在池中创建池初始化。 默认值:0

maxTotal——最大连接数 可以从这个池分配在同一时间。 默认值:8
minIdle最小连接数 同时将空闲池。 默认值:0
maxIdle的最大连接数 同时可以空闲池。 默认值:8

maxWaitMillis——最大的毫秒数 池将等待(当没有可用的连接) 连接抛出异常之前返回。 默认值:1(无限)
一些额外的属性处理连接验证:

validationQuery- - - - - - SQL查询,可以使用的 验证连接池之前返回 应用程序。 如果指定的,这必须是一个SQL SELECT查询 至少语句返回一行。

validationQueryTimeout——在秒超时 为验证查询返回。 默认值:1(无限)
testOnBorrow-真或假:是否连接 应验证使用验证查询每一次吗 从池中借来的。 默认值:真正的
testOnReturn-真或假:是否连接 应验证使用验证查询每一次吗 返回到池中。 默认值:假
可选的驱逐者线程负责减少池 通过移除任何连接闲置很长一段时间。 驱逐者的 不尊重minIdle。 注意,您不需要 激活驱逐者线程池,如果你只想要缩小显示 的配置maxIdle财产。

驱逐者默认情况下是禁用的,可以使用配置 以下属性:

timeBetweenEvictionRunsMillis——的数量 驱逐者的毫秒之间的连续运行。 默认值:1(禁用)

numTestsPerEvictionRun——连接的数量 将检查在每个懒惰被驱逐者 驱逐者的运行。 默认值:3

minEvictableIdleTimeMillis——的空闲时间 毫秒之后,从池中连接可以删除 被驱逐者。 默认值:30 * 60 * 1000(30分钟)
testWhileIdle-真或假:是否连接 应该被驱逐者线程使用验证查询验证 坐在空闲池中。 默认值:假
另一个可选的功能是消除废弃的连接。 连接被称为废弃如果应用程序不返回它 池很长一段时间。 这类连接池可以关闭 从池中自动删除它们。 这是一个解决方案 应用程序连接泄漏。

放弃功能默认是禁用的,可以配置 使用以下属性:

removeAbandoned-真或假:是否 从池中删除废弃的连接。 默认值:假

removeAbandonedTimeout——的数量 秒后,借来的连接被认为是放弃了。 默认值:300
logAbandoned-真或假:是否日志 堆栈跟踪的应用程序代码被遗弃的一份声明 或连接。 这增加了严重的开销。 默认值:假
最后有各种属性,允许进一步的微调 池的行为:
defaultAutoCommit-真或假:违约 自动提交的由该池的连接状态。 默认值:真正的
defaultReadOnly-真或假:违约 只读状态的连接由该池。 默认值:假
defaultTransactionIsolation这个设置 默认的事务隔离级别。 可以是其中一个NONE,READ_COMMITTED,READ_UNCOMMITTED,REPEATABLE_READ,SERIALIZABLE。 默认值:没有默认设置
poolPreparedStatements-真或假:是否 池callablestatement preparedstatement。 默认值:假

maxOpenPreparedStatements——开放的最大数量 语句从语句池可以分配在同一时间。 默认值:1(无限)

defaultCatalog——默认的目录的名称。 默认值:未设置

connectionInitSqls——一个SQL语句列表 创建一个连接后运行一次。 单独的多个语句 由分号(;)。 默认值:没有声明

connectionProperties——特定的驱动程序列表 为创建连接属性传递给驱动程序。 每一个 属性是作为name=value多个属性 由分号(;)。 默认值:没有属性
accessToUnderlyingConnectionAllowed正确或错误:是否 访问底层连接是被允许的。 默认值:假

第二步:

配置web.xml

<resource-ref>  <description>   配置描述内容  </description>  <res-ref-name>   这里写刚刚配置context.xml里面的 Resource标签的 name值  </res-ref-name>  <res-type>  这里写刚刚配置context.xml里面的 Resource标签的 type</res-type>  <res-auth>     这里写刚刚配置context.xml里面的 Resource标签的 auth值  </res-auth></resource-ref>

tomcat里面的内容配置完成!

接下来就是使用数据库连接池!

1:我用的是创建一个DBHelper,然后调用DBHelper,使用数据库连接池

package com.wj.DBHelper;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import javax.naming.Context;import javax.sql.DataSource;public class DBHelper {    public static Connection myConn(){        Connection conn=null;        try {            //实例化InitialContext对象            Context context = new InitialContext();            //进入java池中找/comp/env            Context envContext=(Context)context.lookup("java:/comp/env");            //在根据name值进入数据库池中找jdbc/G160628DB的Source配置            DataSource dataSource=(DataSource)envContext.lookup("jdbc/G160628DB");//配置name值            //把从数据库里面拿出来的值复制给conn            conn=dataSource.getConnection();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        //返回conn        return conn;    }    /**    * @author admin    * 关闭连接的方法    **/    public static void myClose(Connection conn,PreparedStatement ps,ResultSet rs){        try {            //如果 conn 不为空 并且 conn没有关闭 就关闭conn            if(conn != null && !conn.isClosed()){                conn.close();            }            //如果 ps 不为空 就关闭 ps            if(ps != null){                ps.close();            }            //如果 rs 不为空 就关闭 rs             if(rs != null){                rs.close();            }        } catch (Exception e) {            e.printStackTrace();        }    }}

注释:如果那个地方有错误,或是有改进:还请各位帮个忙指出来!谢谢!你们的吐槽将是我进步的空间!谢谢。

原创粉丝点击