如题,在使用虚拟主机的情况下,该如何使用连接池?效率如何?
解决方案 »
- jsp页面中struts2的标签,不能解析,出错
- 关于获取客户端IP,总是不尽如人意
- cn.cstp.org.exception.MyRuntimeException: 请问哪里错了呢
- 关于Hibernate中update()的问题(在线等!)谢谢大家
- ?求助=商业jsp网站怎么使动态转变成了静态!
- 一个存储过程的问题 很简单 大家都看下
- SSH:multipart/form-data,Action中如何取textfield
- 高分请教JSP中日期型变量的有关方法!
- ~~~~!◎◎#请教各位大哥:怎样存储邮件内容content为Object类型到SQL Server
- 在tomcat下连接oracle8i的javabean出现如下错误,急!
- 有关下拉列表的问题,请大家帮个忙
- 一个不能实现的技术难题,在一个java程序中,如何自动点击网页中的提交按钮
呵呵舒舒服服地帮"function_chk()"顶一下
比如用dbcp,或者写到META-INF中
1、先写一个属性文件:Proxool.properties,放入你的WEB应用程序的WEB-INF\classes下面,内容如下:
jdbc-0.proxool.alias=mysql
jdbc-0.proxool.driver-class=org.gjt.mm.mysql.Driver
jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/soft?user=root&password=
jdbc-0.proxool.maximum-connection-count=20
jdbc-0.proxool.prototype-count=4
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
jdbc-0.proxool.verbose=true
jdbc-0.proxool.statistics=10s,1m,1d
jdbc-0.proxool.statistics-log-level=DEBUG 2、web.xml如是写:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>propertyFile</param-name>
<param-value>WEB-INF/classes/Proxool.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/Admin</url-pattern>
</servlet-mapping>
</web-app> 3、将驱动程序mm.mysql-2.0.14-bin.jar与proxool-0.8.3.jar放入WEB-INF\lib目录下。
4、下面是测试的jsp文件:
<%@ page import="java.sql.*" %>
<%@ page contentType="text/html;charset=GB2312" %>
<html>
<head>
<title>CH14 - Proxool.jsp</title>
</head>
<body>
<h2>使用 Proxool Connection Pool</h2>
<%
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try{
con = DriverManager.getConnection("proxool.mysql");
stmt = con.createStatement();
String query = "select * from count_num";
rs = stmt.executeQuery(query);
while(rs.next()) {
out.print(rs.getLong(1)+"--OK");
}
stmt.close();
con.close();
}catch(SQLException sqle){
out.println("sqle="+sqle);
}
finally{
try {
if(con != null){
con.close();
}
}catch(SQLException sqle){
out.println("sqle="+sqle);
}
}
%>
</body>
</html>
5、后台统计与信息
请进入:http://127.0.0.1:8080/testpxool/Admin
(testpxool应改为你的WEB应用程序名)
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;
import org.apache.log4j.Logger;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDriver;
/**
* ?数据库连接缓冲池
*/
public class DBPool {
private final static Logger logger = Logger.getLogger(DBPool.class);
private static String dbIP = "192.168.0.132";
private static String dbJdbc = "jdbc:postgresql://" + dbIP + "/sample";
private static String dbUser = "sample";
private static String dbPwd = "sample";
private static Class driverClass = null;
private static ObjectPool connectionPool = null;
public DBPool() {
}
/**
* 初始化数据源
*/
private static synchronized void initDataSource() {
//驱动数据源
if (driverClass == null) {
try {
driverClass = Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
logger.error(e.getMessage(), e);
}
}
}
/**
* 连接池启动
* @throws Exception
*/
public static void StartPool() {
// 记录连接源的字符串
logger.info(dbJdbc);
// 初始化数据源
initDataSource();
// 如果连接池为空
if (connectionPool != null) {
ShutdownPool();
}
try {
connectionPool = new GenericObjectPool(null);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
dbJdbc, dbUser, dbPwd);
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
connectionFactory, connectionPool, null, null, false, true);
Class.forName("org.apache.commons.dbcp.PoolingDriver");
PoolingDriver driver = (PoolingDriver) DriverManager
.getDriver("jdbc:apache:commons:dbcp:");
driver.registerPool("dbpool", connectionPool);
logger.info("Init Pool for Database Connection Succees.");
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
/**
* 释放连接池
*/
public static void ShutdownPool() {
try {
PoolingDriver driver = (PoolingDriver) DriverManager
.getDriver("jdbc:apache:commons:dbcp:");
driver.closePool("dbpool");
} catch (SQLException e) {
logger.error(e.getMessage(), e);
}
}
/**
* 打印连接池状态
*/
public static String GetPoolStats() {
StringBuffer stat = new StringBuffer();
try {
PoolingDriver driver = (PoolingDriver) DriverManager
.getDriver("jdbc:apache:commons:dbcp:");
ObjectPool connectionPool = driver.getConnectionPool("dbpool");
stat.append("-- Active Connection: ");
stat.append(connectionPool.getNumActive());
stat.append(" ,");
stat.append("Free Connection: ");
stat.append(connectionPool.getNumIdle());
stat.append(" . --");
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return stat.toString();
}
/**
* 取得连接池中的连接
* @return
*/
public static Connection getDbConnection() {
Connection conn = null;
if(connectionPool == null)
StartPool();
try {
conn = DriverManager
.getConnection("jdbc:apache:commons:dbcp:dbpool");
} catch (SQLException e) {
logger.error(e.getMessage(), e);
}
return conn;
}
}
其实<load-on-startup>1</load-on-startup> 是关键。
就是让你写的那个初始化连接池的那个servlet在应用启动时加载一下而已。
<Resource auth="Container" name="jdbc/jndiname" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/jndiname">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>2</value>
</parameter>
<parameter>
<name>password</name>
<value>密码</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://数据库ip:1433;databaseName=数据库名;SelectMethod=Cursor</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>2</value>
</parameter>
<parameter>
<name>username</name>
<value>用户名</value>
</parameter>
</ResourceParams>
这样配置好象写在web.xml中不行,可又没有权限写在站点配置文件中,我也想知道这个问题应如何解决