我现在有一个java application,命令行下运行的,需要连续运行几个月的时间。大概的程序流程就是使用socket接收和发送数据,现在都是用jdbc方式获得connection并使用的。我的问题是担心在运行一段时间后,这个connection会被数据库关闭掉有没有办法维持一个connection一直保持可用状态呢?这个系统只有这一个connection,不必担心多用户的问题。
调试欢乐多
对于你这句话我没有理解。你的前一句话也似乎也在说你的连接方式是socket的长连接。这个连接的地址是从数据库中获得并去连接的意思吗?一般的连接最好还是以池的方式体现出来。既然你的系统中存在多用户的状况,对于每个用户从系统的角度来说都应该是并行的。
可以啊.
连接池不一定是写在配置文件里的啊.
你可以自己实现 Connection 接口 重写里面的 close() 方法
然后 定义一个集合 来做一个简单的连接池
并不关闭连接,需要采用 JDK 的动态代理重写 close() 方法。如果是担心长时间连接断掉的问题,那就复杂了。要采用一个线程来监视这个
Connection,当它被数据库强行断开了,就马上重连,呵呵,说说很简单,
实现是相当复杂的。建议楼主不要考虑自己实现了,要考虑的问题很多很多。用一个字概括就是:难可以考虑使用开源的数据库连接池,比如:C3P0、DBCP 等。如果只需要一个
连接配置成一个就可以了,既方便又好使,为什么不用呢?
import java.sql.Connection;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;import com.mchange.v2.c3p0.ComboPooledDataSource;/**
* C3P0连接池
*/
public class ConnectionFactory { private ConnectionFactory(){
} private static ComboPooledDataSource ds = null; static {
try {
// 如果不想出现 C3P0 的日志信息,把注释去掉就行了
// Logger log = Logger.getLogger("com.mchange");
// log.setLevel(Level.WARNING);
ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
ds.setUser("root");
ds.setPassword("root");
ds.setMaxPoolSize(1); // 设置最大的连接数量
ds.setMinPoolSize(1); // 设置最小的连接数量
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection con = null;
try {
con = ds.getConnection();
} catch (SQLException e1) {
e1.printStackTrace();
}
return con;
}
// C3P0 end
}
一个简单的 main 方法就可以用了。
import com.mchange.v2.c3p0.ComboPooledDataSource;
楼主【slam21】截止到2008-06-28 09:57:53的历史汇总数据(不包括此帖):
发帖数:17 发帖分:375
结贴数:12 结贴分:355
未结数:5 未结分:20
结贴率:70.59 % 结分率:94.67 %
楼主加油
class DBSleepAvoid extends java.util.TimerTask
{
public void run()
{
**.MyDebug.TRACEINFORMATION(this,"run","Send message to each DB connection...");
MyDBConnectionPoolX.checkPools();
}
}
select 1
select 1 from dual之类的,根据数据库不同,使用任何一个没有意义的语句即可比如10分钟调用一次,这样可以保证链接一直有效。2 我很少遇到链接必须一直打开的。使用连接池,在用到时从池里获取,用完了马上归还(close());
不用担心性能问题,连接池会保证可用性的。
需要用到commons-dbcp,commons-pool,commons-collections,可以到http://commons.apache.org下载
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;import org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory;public class ConnectionManager {
private static DataSource ds = null;
public static Connection getConnection() throws SQLException {
if (ConnectionManager.ds == null) {
try {
ConnectionManager.ds = InitialContext.doLookup( "java:comp/env/jdbc/testdb" );
}
catch (NamingException e) {
Properties p = new Properties();
p.setProperty( "driverClassName", "com.mysql.jdbc.Driver" );// 你的数据库驱动类
p.setProperty( "maxActive", "4" );
p.setProperty( "maxIdle", "4" );
p.setProperty( "maxWait", "5000" );
p.setProperty( "password", "" );
p.setProperty( "username", "root" );
p.setProperty( "url", "jdbc:mysql://127.0.0.1/forum" );// 你的数据库链接URL
try {
ConnectionManager.ds = BasicDataSourceFactory.createDataSource( p );
}
catch (Exception ex) {
}
}
}
return ConnectionManager.ds.getConnection();
}
public static void main(String [] args) throws SQLException {
Connection conn = ConnectionManager.getConnection();
// TODO:你自己的操作数据库代码
}
private ConnectionManager() {
}
}
一般数据库的socket连接是数据库管理超时的。最好建个池!
并且没有多用户访问的环境
可以不考虑用池,毕竟用池也是一大块资源最简单的办法,做一个Thread
然后每隔几分钟发送一个无意义select就可以
比如
select true