`
ganjp
  • 浏览: 72169 次
  • 性别: Icon_minigender_1
  • 来自: 其实还可以
社区版块
存档分类
最新评论

数据库会话连接,和数据库Connection问题

阅读更多

  这周末项目中一个数据库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数据库的后台进程,请大家不要对这些会话进行任何操作。

分享到:
评论

相关推荐

    java课程设计数据库连接

    在JSP中,我们可以使用内置对象如`request`、`response`和`session`来处理用户请求,读取表单数据,向数据库发送更新请求,以及管理用户的会话状态。 例如,一个简单的JSP页面可能包含以下代码,用于接收用户提交的...

    java web测试数据库连接是否正常

    3. **建立连接**:使用`DriverManager.getConnection()`方法,传入数据库URL、用户名和密码来获取`Connection`对象,表示与数据库的会话。 4. **创建Statement**:通过`Connection`对象的`createStatement()`方法...

    java web 开发 数据库的连接

    例如,当完成数据库操作后,应及时关闭结果集(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++ ...

    java 连接数据库实现用户登录功能

    2. **建立数据库连接**:使用DataSource创建Connection对象,它是与数据库的会话。 ```java import java.sql.Connection; Connection conn = dataSource.getConnection(); ``` 3. **创建Statement和执行SQL查询**...

    Oracle经典故障解析 连接数&会话数

    3. 进程、会话和连接之间的关系:一个连接可以包含一个或多个会话。当用户使用数据库时,每个登录都会产生一个会话,而这些会话通过进程来处理。通常,一个会话对应一个进程,但实际情况可能有所不同,例如一个进程...

    利用JDBC实现Java程序与数据库的连接

    2. `Connection`接口:代表数据库的会话,提供了执行SQL语句和事务管理的方法。 - `Statement createStatement()`:创建一个用于执行SQL语句的Statement对象。 - `void commit()`:提交当前事务。 - `void ...

    informix数据库连接驱动jar包

    这些jar文件包含了必要的类和资源,使得Java程序能够利用JDBC(Java Database Connectivity)API来执行SQL语句、管理数据库会话以及处理数据。在本讨论中,我们将深入探讨每个jar文件的作用以及它们在构建Informix...

    EJB连接Oracle数据库

    通常在会话bean中创建一个方法,使用`InitialContext`查找JNDI数据源,然后调用`DataSource.getConnection()`获取数据库连接。 5. **连接池**:为了提高性能和资源管理,Java EE服务器通常会提供连接池服务。当EJB...

    神通数据库JDBC驱动包

    1. **Driver接口**:这是JDBC的核心,实现了该接口的类可以注册到Java的DriverManager中,以便应用程序通过URL和连接参数创建数据库连接。 2. **Connection接口**:表示到数据库的会话,提供了执行SQL语句和管理...

    关于java与数据库的连接

    `Connection`接口是JDBC中的核心接口,它表示与特定数据库的会话。通过`Connection`,开发者可以执行SQL语句,创建`Statement`、`PreparedStatement`或`CallableStatement`对象。`Statement`接口用于执行静态SQL语句...

    连接各种数据库的sql语句

    首先,我们关注的是“连接”这一概念,它在数据库世界中通常指的是建立数据库连接或者会话。SQL语句中的`CONNECT`命令或其变体(如在Java中使用JDBC的`DriverManager.getConnection()`方法)用于建立这种连接。例如...

    连接数据库

    使用JDBC,开发者可以编写代码来执行SQL语句,处理结果集,并管理数据库会话。 传统的数据库连接方法通常涉及以下步骤: 1. 加载驱动:应用程序需要加载对应的数据库驱动,如MySQL的JDBC驱动。 2. 建立连接:使用`...

    Java--Access数据库连接和Tomcat的远程设置

    Java是一种广泛使用的编程...通过上述方法,你可以在Java程序中成功连接到Access数据库,并实现对Tomcat服务器的远程调试,从而提升开发效率和问题排查能力。请确保在实际操作中,根据自己的环境和需求调整代码及配置。

    通过ASP与ACCESS数据库建立连接 中文WORD版.rar_数据库连接

    在提供的压缩包文件中,"通过ASP与ACCESS数据库建立连接.doc"很可能是详细讲解这一主题的文档,包含了具体的步骤和示例代码。而".url"文件则是指向相关资源的快捷方式,方便读者获取更多学习资料。 总的来说,通过...

    用 jdbc 管理数据库连接,可以方便的管理数据库的连接

    4. **Connection**:表示与数据库的会话,用于执行SQL语句。 5. **Statement/PreparedStatement**:用于执行SQL语句。Statement处理静态SQL,而PreparedStatement处理预编译的SQL,提供更好的性能和安全性。 6. **...

    c连接Oracle数据库

    在C中,使用OCI API中的`OCIEnvCreate()`初始化环境上下文,然后使用`OCIServerAttach()`和`OCISessionBegin()`等函数来建立数据库会话。 ### 3. 执行SQL查询 在C#示例中,`OracleCommand`用于执行SQL语句。C语言...

    C++ 连接数据库实例

    3. **会话创建**:使用`OCILIBConnect`函数创建一个连接句柄,输入数据库的用户名、密码和连接字符串(服务名或TNS名称)。 4. **游标分配**:在Oracle中,游标用于执行SQL语句和处理结果集,通过`OCILIBStatement`...

Global site tag (gtag.js) - Google Analytics