连接池运作原理:
在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例如:Weblogic, WebSphere,JBoss)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。
如果有对Java感兴趣程序员,可来我们的Java交流扣qun哦:854818273里面免费送Java的系统教程噢! 小编也是一名从事了8年的高级架构师,花了近两个月整理了一份较适合当下学习的干货,以及我这8年的工作经验,分享给每一位想学Java的小伙伴,这里是Java学习者聚集地,欢迎进阶中的小伙伴。
数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。
数据库连接池的主要操作如下:
(1)建立数据库连接池对象(服务器启动)。
(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
(3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
(4)存取数据库。
(5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
(6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
1.先把连接oracle的驱动放到tomcat5.5/common/lib目录中,,这样他就可以自动找到驱动.
*****javaee里面的四个引用包都要拷到 webroot里面的web-inf里面的lib文件下
2.在tomcat5.5目录下找到conf目录下找到server.xml文件
在这个文件中 找到context标签,在标签context中加入以下标签
<!--未打包好的源代码路径docBase,打包好即:docBase="FileUpload.war"-->
****测试时不能用war,否则后果很严重
<Context path="/FileUpload" docBase="D:/workspace/FileUpload/WebRoot">
<Resource
name="jdbc/oracle"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
password="hpp"
maxIdle="30"
maxActive="100"
maxWait="5000"
username="hpp"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
</Context>
3.参数说明
Tomcat连接池中,部分参数说明如下:
name:为这个连接池指定一个名字
type:数据源类型, 一般不需要动
driverClassName:驱动名字,一般也不需要动
password 和username都不用说吧
maxActive="100" < !--最大活跃连接数,这里取值为100,表示同时最多有100个数据库连接。设为0表示无限制。-->
maxIdle="30" < !--最大的空闲连接数,这里取值为30,表示即使没有数据库连接时依然可以保持30个空闲的连接,而不被清除,随时处于待命状态。设为0表示无限制。-->
maxWait="10000" < !--最大建立连接等待时间。如果超过此时间将接到异常。这里设置为10000,表示10秒后超时。设为-1表示无限制,直到超时为止。-->
PS:如果最大数据库活跃连接数过大,可想而知,内存占用量是非常惊人的!如果空闲连接数过大,则资源利用率低,连接池长期未释放,可导致连接池结点异常。所以选好maxActive和maxIdle是连接池性能的关键因素,当然这取决于服务器环境。
JDBC获取Connection的方法也要改变
private final String driver="oracle.jdbc.driver.OracleDriver";
private final String url="jdbc:oracle:thin:@localhost:1521:orcl";
private final String user="hfq";
private final String pwd="hfq";
Connection conn=null;
// public TJDBC(){
// try {
// Class.forName(driver);
// try {
// conn=DriverManager.getConnection(url,user,pwd);
// conn.setAutoCommit(false);//设置自动提交
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// } catch (ClassNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// }
public TJDBC(){
try {
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/oracle");// jdbc/oracl名称
conn = ds.getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}