文中内容主要转自:http://www.open-open.com/lib/view/open1327478028639.html

http://www.open-open.com/lib/view/open1365991769687.html

http://blog.csdn.net/lzm1340458776/article/details/37901619

tomcat jdbc pool 可在 Tomcat 中直接使用,也可以在独立的应用中使用。

属性说明:

name 数据源名称,这个随便,通常取为jdbc/XXX的格式
auth Container容器
type javax.sql.DataSource 注意是javax不是java
username 数据库用户名
password 数据库用户密码
maxIdle

连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,

连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)

maxActive 连接池的最大数据库连接数。设为0表示无限制。
maxWait 等待连接的最大连接的时间。最大等待毫秒数, 单位为 ms, 超过时间会出错误信息
driverClassName 数据库完整的驱动类全称。
url 数据库链接

1. 在独立应用中使用:

 import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement; import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties; public class SimplePOJOExample { public static void main(String[] args) throws Exception {
PoolProperties p = new PoolProperties();
p.setUrl("jdbc:mysql://localhost:3306/mysql");
p.setDriverClassName("com.mysql.jdbc.Driver");
p.setUsername("root");
p.setPassword("password");
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(10);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(10);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
DataSource datasource = new DataSource();
datasource.setPoolProperties(p);

Connection con = null;
try {
con = datasource.getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from user");
int cnt = 1;
while (rs.next()) {
System.out.println((cnt++)+". Host:" +rs.getString("Host")+
" User:"+rs.getString("User")+" Password:"+rs.getString("Password"));
}
rs.close();
st.close();
} finally {
if (con!=null) try {con.close();}catch (Exception ignore) {}
}
} }

2. 在 Tomcat 中直接使用

方式一、

1). 找到tomcat所在目录中的conf文件夹中的context.xml文件,在其中做修改(在Context结点里面添加):

 <!—mysql数据源配置-->
<Resource
name="ds_mysql"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdel="30"
maxWait="10000"
username="root"
password="5982285"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/myblog"
/>
<!—oracle数据源配置-->
<Resource
name="jdbc/oracleds"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdel="30"
maxWait="10000"
username="scott"
password="tiger"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:sky"
/>

注:上面为mysql和Oracle配置了数据源,看个人需求而定,二者选其一。

注:网上很多人都说需要在web.xml文件中再次配置,其实不配置也是可以的(本人就没有在web.xml配置,依然跑的很溜),另外有一个要

       特别注意的是要将数据源的jar包和数据库的驱动包放到tomcat的lib包中。

JNDI技术简介

JNDI(Java Naming and Directory Interface)即Java命名和目录接口,它对应于Java EE中的javax.naming包,这套API的主要作用:它可以

把DataSource对象放在一个Tomcat容器中(JNDI容器),并为容器中的DataSource对象取一个名称,以后程序想获得DataSource对象,只需

要通过名称检索即可。

JNDI的核心API为Context,它代表JNDI容器,核心方法是lookup()它的功能是检索容器中对应名称的对象。

连接池工具类:

 /**
* 获取数据库连接的工厂
* @author Liao
*/
public class ConnectionFactory { private static DataSource dataSource; static {
try {
//初始化查找命名空间
Context context = new InitialContext();
//找到DataSource。 java:/comp/env为固定路径。  ds_mysql是tomcat中设置的数据源  
dataSource = (DataSource) context.lookup("java:comp/env/ds_mysql");
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 获取数据库连接
*/
public static Connection getConnection(){
try {
//通过数据源获取连接然后返回
return dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
return null;
}
} /**
* 关闭资源
* @param conn
* @param sta
* @param res
*/
public static void closeConnection(Statement sta, ResultSet res) {
try {
if (res != null) {
res.close();
res = null;
}
if (sta != null) {
sta.close();
sta = null;
} } catch (SQLException e) {
e.printStackTrace();
}
}
}

注:上述程序,没有关闭连接,是因为用完连接之后,连接又回到了连接池,处于空闲状态。       

     java:/comp/env为固定路径。  ds_mysql是tomcat中设置的数据源

连接池配置常见错误:
Invalid byte 1 of 1-byte UTF-8 sequence.

原因:

在context.xml文件中使用了中文的注释(这个确实比较坑爹,但确实是这样的)。

解决方案:

把中文的注释去掉即可。

方式二、

1). 在conf/server.xml下的<GlobalNamingResources>节点里配置resource,例如:

 <Resource name="jdbc/ens"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="100"
minIdle="10"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors=
"org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="root"
password="123"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ens"/>

然后,在context.xml文件的<Context></Context>节点中添加如下配置:

 <ResourceLink global="jdbc/ens" name="jdbc/ens" type="javax.sql.DataSource"/>

global="jdbc/ens" 中的参数值("jdbc/ens")必须和上一段<Resource >配置中的name属性的值保持一样。name="jdbc/ens" 这个可以随便取,

但是在程序中调用的时候,就应该与name的值保持一致。到这里,连接池已经配置好啦。用JSP测试一下:

 <%@ page language="java" pageEncoding="gbk"%>
<%@page import="java.sql.Connection"%>
<%@page import="javax.naming.Context"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.ResultSet"%>
<%
//连接池的获取
Connection conn = null;
DataSource ds = null;
ResultSet rs =null;
Statement stmt = null;
Context initCtx = new InitialContext();
ds =(DataSource)initCtx.lookup("java:comp/env/jdbc/ens");
if(ds!=null){
out.println("已经获得DataSource!");
out.println("<br>");
conn = ds.getConnection();
try{
stmt = conn.createStatement();
String sql ="select * from ens_area";
rs = stmt.executeQuery(sql);
out.println("以下是从数据库中读取出来的数据:<br>");
while(rs.next()){
out.println("<br>");
out.println(rs.getString("area_name"));
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
conn.close();
rs.close();
stmt.close();
}
}
%>

参数介绍:

1. initialSize :连接池启动时创建的初始化连接数量(默认值为0) 

2. maxActive :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定) 

3. maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,

    连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置) 

4. minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;

    但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置) 

5. maxWait  :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因

    线程池不够用,而导致请求被无限制挂起) 

6. poolPreparedStatements:开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。) 

7. maxOpenPreparedStatements:开启池的prepared 后的同时最大连接数(默认无限制,同上,未配置) 

8. minEvictableIdleTimeMillis  :连接池中连接,在时间段内一直空闲, 被逐出连接池的时间 

9.(默认为30分钟,可以适当做调整,需要和后端服务端的策略配置相关) 

10. removeAbandonedTimeout  :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180) 

11. removeAbandoned  :超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)

数据库重连机制,参考文章:

http://agapple.iteye.com/blog/791943

http://agapple.iteye.com/blog/772507

http://lc87624.iteye.com/blog/1734089

最新文章

  1. 深入JVM-常用Java虚拟机参数
  2. C# ZipHelper C#公共类 压缩和解压
  3. C与Python变量的区别
  4. Centos 7配置ntp时间同步
  5. printf输出字符串的一些格式
  6. 【JavsScript】Spine的作者曾经是Backbone的作者
  7. 没用调用flush导致的数据保存丢失
  8. 如何在swift中实现oc中的分类
  9. Spring ApplicationContext的国际化支持
  10. .net网站开发(一):1.input表单元素
  11. SQL Server 表压缩
  12. Mac下面的SecureCRT以及破解方案详解
  13. /dev/null 2&gt;&amp;1 详解
  14. ThreadPoolExecutor源码解析(二)
  15. 【BZOJ2671】Calc(莫比乌斯反演)
  16. SQL3-查找各个部门当前(to_date=&#39;9999-01-01&#39;)领导当前薪水详情以及其对应部门编号dept_no
  17. 【Graphite】Graphite常用函数使用
  18. 使用SSH过程中遇到的几个问题及解决方案
  19. 修改ie11的默认搜索引擎和主页
  20. ThinkPHP5 API 文档

热门文章

  1. SVN迁移及备份的方法【转】
  2. php学习八:封装
  3. poj_3436 网络最大流
  4. 深入浅出Docker(五):基于Fig搭建开发环境
  5. jQuery中的ajax用法案例
  6. sencha touch 入门系列 扩展篇之sencha touch 项目打包压缩
  7. FlashDevelop导入swc库
  8. 使用FileZilla向linux系统上传文件
  9. [MongoDB]安装MongoDB遇到问题
  10. ios UIImage图片拉伸 resizableImageWithCapInsets: