在Spring+hibernate里关闭远程Oracle dblink
Oracle有一个dblink的东西可以在数据库里远程连接另一个数据库(不仅限于Oracle数据库),通过下列方法创建oracle dblink:
两种方式:
1、已经配置本地服务
linkname fwq12 connect to fzept
identified by neu using 'fjept'
CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘本地配置的数据的实例名’;
2、未配置本地服务
connect to fzept identified by neu
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = fjept)
)
)';
host=数据库的ip地址,service_name=数据库的ssid
通过下列语句操作dblink的数据库:
SELECT * FROM tableName@linkname;
但是,每次使用dblink查询的时候,均会与远程数据库创建一个连接,dblink应该不会自动释放这个连接。这会引起很多问题,有可能dblink连接断了,继续操作远程数据库就会出错;不释放远程数据库连接,可能会导致远程数据库连接爆满;还可能会导致本地数据库连接泄露等。
在Spring+hibernate架构下,用下列代码关闭dblink数据库连接:
In every method call of the service layer which is calling a dao method which is opening a db link, after the method returns from the dao I close the db link session in the service layer.
public List getBeschaffungen()
{
List beschaffungList = beschaffungDao.getBeschaffungList(suchFilterManage r.getSuchFilter());
beschaffungDao.closeDbLinkSession("dllinkname");
return beschaffungList;
}
public void closeDbLinkSession(final String dbLinkName)
{
getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException
{
Statement statement = session.connection().createStatement();
statement.execute("Alter session close database link "+dbLinkName);
logger.info("closing "+dbLinkName+" dblink session");
statement.close();
return null;
}
});
}