resin 数据池被占满问题

问题描述

环境linux,apache,resin,oracle一直运行很好,最近老是出现java.sql.SQLException: Can't open connection with full database pool (20)打开进程一看,oracle进程一堆。是resin连接池被占满了。把resin重启后,数据池立即又被占满了。不知道是什么原因。请朋友门赐教。可能是哪方面的原因。该如何查起了。问题补充:waterdh (初级程序员) 检查数据库连接代码,看哪里没有释放连接不知道该从哪下手,数据库连接代码是公用的,很多地方使用到了,该从哪下手了。郁闷。

解决方案

有一个比较简便的方法可以跟踪哪些数据库连接没有释放,就是做一个代理类,这个代理类自己有个超时机制,超时没有释放的则打印调用堆栈。使用的时候要将这个伪装的DataSource打包成JAR放在resin的库目录(因为你在resin配置了连接池)以下是这个代理类的部分代码,有兴趣的话,你自己补全即可。希望有所帮助。GOOD LUCKpackage com.poweroa.jdbc;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.SQLWarning;import java.sql.Savepoint;import java.sql.Statement;import java.util.Map;import java.util.Timer;import java.util.TimerTask;import org.apache.commons.dbcp.BasicDataSource;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class MyDataSource extends BasicDataSource {//此处使用apache的dbcp,你实际Resin环境使用的是什么DataSource就继承它,注意有些连接池是final类,不可被继承,所以尽量使用dbcp做测试。public final static Timer timer = new Timer(true);//定时器,用来运行Connection记录超时的代理。Log logger = LogFactory.getLog(MyDataSource.class);//log4j的使用就不必说了吧。class ProxyConnection implements Connection{//本dataSource getConnection方法返回的代理Connection对象Connection innnerConnection;//实际的连接池里的连接String uuid;TimerTask task;public ProxyConnection(Connection conn,String uuid){task=new TimerTask(){@Overridepublic void run() {//里面的代码是堆栈跟踪用的,所以那么奇怪,自己抛出异常又自己捕捉了。try {throw new RuntimeException();} catch (RuntimeException e) {logger.debug(e);//其实log4j作用不大,只是写习惯了。就加上吧。e.printStackTrace();//这句能清楚的打印出调用堆栈。}}};timer.schedule(task, 5000);//设置其5秒后运行,根据你环境实际情况设置,假如你觉得5秒不够,那就10秒,也就是说10秒还不释放此连接则超时。this.innnerConnection=conn;this.uuid=uuid;}public void clearWarnings() throws SQLException {this.innnerConnection.clearWarnings();}public void close() throws SQLException {this.task.cancel();//如果在指定时间内关闭了连接,则取消定时,表示此时调用代码正常关闭了连接,不必跟踪。this.innnerConnection.close();}public void commit() throws SQLException {this.innnerConnection.commit();} //.....此处省略其他Connection接口的方法没有列出来。你自己必须实现它们,//方法内部只有一句:this.innnerConnection.xxx();}//下面是DataSource接口仅有的两个返回Connection对象的方法。都需要覆盖掉,使得返回代理的Connection@Overridepublic Connection getConnection() throws SQLException {Connection conn=super.getConnection(); return new ProxyConnection(conn,java.util.UUID.randomUUID().toString());}@Overridepublic Connection getConnection(String user, String password) throws SQLException {Connection conn=super.getConnection(user,password);if(conn instanceof ProxyConnection)return conn;return new ProxyConnection(conn,java.util.UUID.randomUUID().toString());}}
解决方案二:
悬赏5分啊。哎呀~~好累啊。呵呵,为了5分不容易啊。
解决方案三:
应该是代码中没有及时释放数据库连接造成的,比如由于异常等原因跳出了代码块,没有执行到释放连接的代码。所以还是要仔细,检查数据库连接代码,看哪里没有释放连接

时间: 2024-08-30 21:27:40

resin 数据池被占满问题的相关文章

SQLServer数据库中开启CDC导致事务日志空间被占满的原因

SQLServer中开启CDC之后,在某些情况下会导致事务日志空间被占满的现象为: 在执行增删改语句(产生事务日志)的过程中提示,The transaction log for database '***' is full due to 'REPLICATION'(数据库"***"的事务日志已满,原因为"REPLICATION"). CDC以及复制的基本原理粗略地讲,对于日志的使用步骤如下: 1,每当基础表(开启了CDC或者replication的表)产生事务性操作

jdbc-sturts2 怎么链接到数据池

问题描述 sturts2 怎么链接到数据池 我在tomcat6.0的context.xml文件里加了这个 </Context> <Context reloadable="true"> <Resource name="jdbc/ice_db" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait=&quo

lex utton-Flex 的Button如何让文字占满按钮,不被遮挡

问题描述 Flex 的Button如何让文字占满按钮,不被遮挡 private function addButton(text:String, buttonPage:HBox):void { var btn:Button = new Button(); btn.label = text; btn.setStyle("fontSize",12); //btn.setStyle("margin", 0); //btn.setStyle("padding&quo

imageview-Android两个控件布局,占满父亲

问题描述 Android两个控件布局,占满父亲 我的mainactivity的布局文件,默认的是一个相对布局.我里面就两个控件,一个Button和一个ImageView.我想让Button紧贴着父亲的上面,ImageView占满剩下的区域.Button的高度就普通的就行.我贴上我的代码,老出错.一运行就崩掉. <Button android:id="@+id/mybtn" android:layout_alignParentTop="true" android

Win7 64位编译boost内存占满卡死

问题描述 Win7 64位编译boost内存占满卡死 Win7 4g内存 VS2013 64位编译Boost 1_57_0 运行命令bjam.exe stage --toolset=msvc-12.0 --without-graph --without-graph_parallel --without-math --without-mpi --without-serialization --without-wave --without-test --without-program_options

如图中-怎么让CFormView中的对话框占满整个client区域

问题描述 怎么让CFormView中的对话框占满整个client区域 解决方案 获取formview的大小.然后movewindow等移动框架大小. 解决方案二: http://blog.csdn.net/wlsgzl/article/details/34099313 解决方案三: 没有明白我的意思?如果把CFormView中的控件全部MoveWindow,是非常麻烦的,有没有设置可以让CFormView中的Dialog Frame自动充满CFormView的Client区域

安卓-Android网格布局怎么设置组件占满指定的行和列?

问题描述 Android网格布局怎么设置组件占满指定的行和列? enter code here <GridLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_heigh

ios-tableView占满整个屏幕

问题描述 tableView占满整个屏幕 在app中需要用到一个小 tableView ,我设置了尺寸,但是运行之后 tableview 占了整个屏幕. -(void)viewDidLoad{ UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0 0.0 20.0 60.0) style:UITableViewStylePlain]; self.view = tableView; } - (UITab

盘点全球最热十家大数据公司中国占三席

文章讲的是盘点全球最热十家大数据公司中国占三席,近两年来,大数据发展浪潮席卷全球.研究机构IDC预测,全球大数据与分析市场规模将由2015年的1220亿美元,在5年间成长超过50%,并在2019年底达到1870亿美元的规模.资本也敏锐地追逐着高增长市场.数据显示,美国在2013年大数据领域的新创公司就获得了36亿美金(200多亿人民币)的投资,硅谷大数据公司Palantir更是获得高达200亿美金的估值. 对于被大数据概念包围的人们来说,理解大数据趋势和价值的最有效的办法就是了解最优秀的大数据创