高分求助如何使一个connection一直保持打开的状态?

slam21 2008-04-22 10:32:24
我现在有一个java application,命令行下运行的,需要连续运行几个月的时间。

大概的程序流程就是使用socket接收和发送数据,现在都是用jdbc方式获得connection并使用的。

我的问题是担心在运行一段时间后,这个connection会被数据库关闭掉。。。

有没有办法维持一个connection一直保持可用状态呢?

这个系统只有这一个connection,不必担心多用户的问题。
...全文
596 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChangXiangzhong 2008-07-02
  • 打赏
  • 举报
回复
严重同意:
会引发很多不可与其的结果。
脏读、幻影
这列问题肯定会出现。
[Quote=引用 2 楼 pizzame 的回复:]
如果你的connection是数据库的connection。那你的设计问题可就大了。多用户的时候你是必须考虑线程同步的问题~~

引用楼主 slam21 的帖子:
大概的程序流程就是使用socket接收和发送数据,现在都是用jdbc方式获得connection并使用的。


对于你这句话我没有理解。你的前一句话也似乎也在说你的连接方式是socket的长连接。这个连接的地址是从数据库中获

得并去连接的意思吗?

一般的连接最好还是以池的方式体现出…
[/Quote]
无敌大奇 2008-07-02
  • 打赏
  • 举报
回复
学习..................
andongoop 2008-07-02
  • 打赏
  • 举报
回复
将Connection 修饰为static就ok了。
beiouwolf 2008-07-02
  • 打赏
  • 举报
回复
确定在同一服务器下
并且没有多用户访问的环境
可以不考虑用池,毕竟用池也是一大块资源

最简单的办法,做一个Thread
然后每隔几分钟发送一个无意义select就可以
比如
select true

chief_fu 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oxoxo 的回复:]
这个好说啊,把这个connection做成静态的,写个方法,其他地方请求连接时都调用这个方法,这个方法判断connection是否为空,为空就重新构建一个连接,不为空就返回
[/Quote]
肯定错误!!!自己去找原因!
一般数据库的socket连接是数据库管理超时的。最好建个池!
liming1983 2008-07-01
  • 打赏
  • 举报
回复
楼主看看,可以参考以下下面的实现,这个类可以基于数据库链接池为你的程序提供一个稳定的Connection。
需要用到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() {
}

}


victor_woo 2008-06-30
  • 打赏
  • 举报
回复
回帖是一种美德!传说每天回帖即可获得 10 分可用分! 连续两周技术区参与者,每周额外可以获得88个可用分
victor_woo 2008-06-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 coolzyt 的回复:]
后来搞个线程定时做点什么操作,就可以保持连接了。
[/Quote]

haha
victor_woo 2008-06-28
  • 打赏
  • 举报
回复
new java.util.Timer().schedule(new DBSleepAvoid(),200,1000*60*30);
victor_woo 2008-06-28
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yetaodiao 的回复:]
担心多余

完毕
[/Quote]
呵呵,绝对不是多余,因为我做了类似的事情,那些Connection长时间不用,对象本身还在,但是到数据库的实际连接被DBMS cut掉

我的处理方法是:启动一个独立的线程,定时向连接发送一个请求。


class DBSleepAvoid extends java.util.TimerTask
{
public void run()
{
**.MyDebug.TRACEINFORMATION(this,"run","Send message to each DB connection...");

MyDBConnectionPoolX.checkPools();
}
}
  • 打赏
  • 举报
回复
担心多余

完毕
老紫竹 2008-06-28
  • 打赏
  • 举报
回复
1 如果你的数据库在本机,也就是应用和服务器在一个机器上,你可以让连接定时touch一下数据库,

一般是
select 1
select 1 from dual

之类的,根据数据库不同,使用任何一个没有意义的语句即可

比如10分钟调用一次,这样可以保证链接一直有效。

2 我很少遇到链接必须一直打开的。使用连接池,在用到时从池里获取,用完了马上归还(close());
不用担心性能问题,连接池会保证可用性的。
JavaLover00000 2008-06-28
  • 打赏
  • 举报
回复
学习。。。
roonten 2008-06-27
  • 打赏
  • 举报
回复
用到了连接池
buyaowen 2008-05-13
  • 打赏
  • 举报
回复
为啥非得一直开着?
不明白
coolzyt 2008-05-12
  • 打赏
  • 举报
回复
后来搞个线程定时做点什么操作,就可以保持连接了。
KooKiDi 2008-05-12
  • 打赏
  • 举报
回复
看不懂~UP
jofy1004 2008-05-12
  • 打赏
  • 举报
回复
up
Maojm 2008-04-30
  • 打赏
  • 举报
回复
楼上的兄弟,可否把这个包里代码铁出来看看啊。
import com.mchange.v2.c3p0.ComboPooledDataSource;
  • 打赏
  • 举报
回复
连接池并不一定要挂在应用服务器上的,也不是只有 Web 程序能用的。
一个简单的 main 方法就可以用了。
加载更多回复(10)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧