这周末项目中一个数据库Connection的问题让我困扰了很久,头都弄得大了。。
场景是这样的:
我的Connection我看着是关闭了,但是测试的时候一会就死了,查看代码也查不出问题,
看了下Oracle数据库的连接数:
select username,count(*) from v$session group by username 发现数据库会话数超高,重启服务再debug,发现在哪里会话增加了,但是就是没有发现代码哪里有问题,最后经过老大的指点才知道,Connection在一个方法中和方法调用的子方法中只能存在一个,如果有多个的话就会存在释放的问题。
文字解释估计不行,举个例子吧
写道
//数据库层
public class Dao{
static Connection getConnection() {
//只是一个示例
}
}
public class UserManager {
pubilc User getUserById(int id) {
return getUserById(Dao.getConnection,id);
}
pubilc User getUserById(Connection conn,int id) {
}
public void updateUser(Connection conn,User user) {
}
}
//service层
public class Service() {
public User getUser(int id) {
Connection conn = Dao.getConnection();
//先执行更新 传进去conn
new UserManager().updateUser(conn);
//这里如果你执行getUserById(id)没有传进去Conenction而是在Manager中创建的话,就算你看着代码没有问题,也会出现Connection释放的问题
//new UserManager().getUserById(id);
}
}
在实际的工作中,需要经常要定时对数据库
的连接情况进行检查,查看与数据库
建立的会话数目是不是正常,假如建立了过多的连接,会消耗许多数据库的资源。与此同时,针对一些“挂死”的连接,可能会需要自行手工进行清理。
下面的SQL语句列出当前数据库建立的会话情况:
select sid,serial#,username,program,machine,status
from v$session;
输出的结果:
SID SERIAL# USERNAME PROGRAM MACHINE STATUS
---- ------- ---------- ----------- --------------- --------
1 1 ORACLE.EXE WORK3 ACTIVE
2 1 ORACLE.EXE WORK3 ACTIVE
3 1 ORACLE.EXE WORK3 ACTIVE
4 1 ORACLE.EXE WORK3 ACTIVE
5 3 ORACLE.EXE WORK3 ACTIVE
6 1 ORACLE.EXE WORK3 ACTIVE
7 1 ORACLE.EXE WORK3 ACTIVE
8 27 SYS SQLPLUS.EXE WORKGROUP\WORK3 ACTIVE
11 5 DBSNMP dbsnmp.exe WORKGROUP\WORK3 INACTIVE
其中SID 会话(session)的ID号;
SERIAL# 会话的序列号,和SID一起用来唯一标识一个会话;
USERNAME 建立该会话的用户名;
PROGRAM 这个会话是用什么工具连接到数据库的;
STATUS 当前这个会话的状态,ACTIVE表示会话正在执行某些任务,INACTIVE表示当前会话没有执行任何操作;
假如DBA要手工断开某个会话,则执行:
alter system kill session 'SID,SERIAL#';
注意:
在上面的示例中,SID为1到7(USERNAME列为空)的会话,它是Oracle数据库的后台进程,请大家不要对这些会话进行任何操作。
分享到:
相关推荐
在JSP中,我们可以使用内置对象如`request`、`response`和`session`来处理用户请求,读取表单数据,向数据库发送更新请求,以及管理用户的会话状态。 例如,一个简单的JSP页面可能包含以下代码,用于接收用户提交的...
3. **建立连接**:使用`DriverManager.getConnection()`方法,传入数据库URL、用户名和密码来获取`Connection`对象,表示与数据库的会话。 4. **创建Statement**:通过`Connection`对象的`createStatement()`方法...
例如,当完成数据库操作后,应及时关闭结果集(ResultSet)、声明(Statement)和连接,防止资源泄漏。此外,可以使用try-with-resources语句来自动关闭这些资源。 总的来说,Java Web开发中的数据库连接涉及JDBC...
通过建立Connection对象,你可以创建数据库连接,使用Command对象执行SQL,而Recordset对象则用来处理结果集。 4. **BCB(Borland C++ Builder)与数据库**: `BCB-ADOGUI.zip`和`BCB-ODBC.zip`展示了Borland C++ ...
2. **建立数据库连接**:使用DataSource创建Connection对象,它是与数据库的会话。 ```java import java.sql.Connection; Connection conn = dataSource.getConnection(); ``` 3. **创建Statement和执行SQL查询**...
3. 进程、会话和连接之间的关系:一个连接可以包含一个或多个会话。当用户使用数据库时,每个登录都会产生一个会话,而这些会话通过进程来处理。通常,一个会话对应一个进程,但实际情况可能有所不同,例如一个进程...
2. `Connection`接口:代表数据库的会话,提供了执行SQL语句和事务管理的方法。 - `Statement createStatement()`:创建一个用于执行SQL语句的Statement对象。 - `void commit()`:提交当前事务。 - `void ...
这些jar文件包含了必要的类和资源,使得Java程序能够利用JDBC(Java Database Connectivity)API来执行SQL语句、管理数据库会话以及处理数据。在本讨论中,我们将深入探讨每个jar文件的作用以及它们在构建Informix...
通常在会话bean中创建一个方法,使用`InitialContext`查找JNDI数据源,然后调用`DataSource.getConnection()`获取数据库连接。 5. **连接池**:为了提高性能和资源管理,Java EE服务器通常会提供连接池服务。当EJB...
1. **Driver接口**:这是JDBC的核心,实现了该接口的类可以注册到Java的DriverManager中,以便应用程序通过URL和连接参数创建数据库连接。 2. **Connection接口**:表示到数据库的会话,提供了执行SQL语句和管理...
`Connection`接口是JDBC中的核心接口,它表示与特定数据库的会话。通过`Connection`,开发者可以执行SQL语句,创建`Statement`、`PreparedStatement`或`CallableStatement`对象。`Statement`接口用于执行静态SQL语句...
首先,我们关注的是“连接”这一概念,它在数据库世界中通常指的是建立数据库连接或者会话。SQL语句中的`CONNECT`命令或其变体(如在Java中使用JDBC的`DriverManager.getConnection()`方法)用于建立这种连接。例如...
使用JDBC,开发者可以编写代码来执行SQL语句,处理结果集,并管理数据库会话。 传统的数据库连接方法通常涉及以下步骤: 1. 加载驱动:应用程序需要加载对应的数据库驱动,如MySQL的JDBC驱动。 2. 建立连接:使用`...
Java是一种广泛使用的编程...通过上述方法,你可以在Java程序中成功连接到Access数据库,并实现对Tomcat服务器的远程调试,从而提升开发效率和问题排查能力。请确保在实际操作中,根据自己的环境和需求调整代码及配置。
在提供的压缩包文件中,"通过ASP与ACCESS数据库建立连接.doc"很可能是详细讲解这一主题的文档,包含了具体的步骤和示例代码。而".url"文件则是指向相关资源的快捷方式,方便读者获取更多学习资料。 总的来说,通过...
4. **Connection**:表示与数据库的会话,用于执行SQL语句。 5. **Statement/PreparedStatement**:用于执行SQL语句。Statement处理静态SQL,而PreparedStatement处理预编译的SQL,提供更好的性能和安全性。 6. **...
在C中,使用OCI API中的`OCIEnvCreate()`初始化环境上下文,然后使用`OCIServerAttach()`和`OCISessionBegin()`等函数来建立数据库会话。 ### 3. 执行SQL查询 在C#示例中,`OracleCommand`用于执行SQL语句。C语言...
3. **会话创建**:使用`OCILIBConnect`函数创建一个连接句柄,输入数据库的用户名、密码和连接字符串(服务名或TNS名称)。 4. **游标分配**:在Oracle中,游标用于执行SQL语句和处理结果集,通过`OCILIBStatement`...