proxool连接池

配置文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
<proxool>
<alias>jms1</alias>
<driver-url>jdbc:mysql://localhost/activemq</driver-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="root" />
<property name="password" value="root" />
</driver-properties>
<maximum-connection-count>10</maximum-connection-count>
<prototype-count>2</prototype-count>
<house-keeping-sleep-time>10000</house-keeping-sleep-time>
</proxool>
</something-else-entirely>

注册连接池,和取连接的类,由于没有用到web容器,所以只能自己在类中注册

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;

import org.apache.log4j.Logger;

import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;
import org.logicalcobwebs.proxool.ProxoolException;
//import org.logicalcobwebs.proxool.ProxoolFacade;
//import org.logicalcobwebs.proxool.admin.SnapshotIF;

public class DB {

static Logger logger = Logger.getLogger(DB.class);

static {
try {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
JAXPConfigurator.configure("pool1.xml",false);
JAXPConfigurator.configure("pool2.xml",false);
}catch(ClassNotFoundException cfe) {
logger.error("ClassNotFoundException occur");
}catch(ProxoolException pe) {
logger.error("ProxoolException occur");
}
}

public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection("proxool.jms1");
}catch(SQLException pe1) {
logger.error("main_DB connection failed");
try {
conn = DriverManager.getConnection("proxool.jms2");
}catch(SQLException pe2) {
logger.error("backup_DB connection failed");
}
}
return conn;
}
}

请问下,我这样取连接有问题么?为什么感觉用了连接池,比没用连接池更慢啊
只有单个进程在取连接

另外问下log4j为什么
static Logger logger = Logger.getLogger(DB.class);

而不声明一个static getLogger的方法
这样别人程序里直接用Logger.getLogger(DB.class)不就行么?
请指点下迷津,万分感谢

自问自答
static Logger logger = Logger.getLogger(DB.class);
这种方式不好,如果类比较多,创建的static logger对象就比较多
最好自己写一个static的logger类,创建一个getLogger方法来return logger实例,在其他类中直接className.getLogger().debug(...)这样来用
如果使用spring,则不需要声明为static,默认创建的bean就是singleton.
aop还在研究中,使用aop,好象就不用在每个类里面写logger方法了

配了连接池速度是快点
给tomcat配的连接池,对一个表查询1k次.
直接用jdbc一般是20秒左右
用了连接池在2秒左右

应用程序
用ant运行
直接用jdbc一般是35秒左右
用连接池在7秒左右

直接用java class-name运行
jdbc是30多毫秒 - -
连接池得在命令行里+classpath,不然报错,classpath太长了就没测

关于static Logger logger = Logger.getLogger(DB.class);

今天调jms的时候看到static Context ictx = null;
跟log4j的调用一样,都是使用的static,觉得自己原来的想法有问题,查了下资料
The difference is that without the static modifier, you have a Logger reference for every object in your system. This is a waste of memory and runtime resources.

有哪位达人知道确切答案 指点下么

static Logger logger = Logger.getLogger(DB.class);
这种方式不好,如果类比较多,创建的static logger对象就比较多

没错,但这个logger是相当于你当前类的变量.而传入了DB.class 这个参数,这个参数会在LOG4J中%C输出这个类路径.如果你用getRootLogger().那你可以尝试一下整个应用全局定义一个logger.我认为传入DB.class这类参数是为了更准确的描述出你出错的位置