我有一个使用Java、mybatis和SQL Anywhere的应用程序。由于某些原因,我必须在运行时手动加载SQLA驱动程序jar文件。我使用以下代码实现了这个功能:
public static URLClassLoader ucl;
public static Driver saDriver;
public static final void loadSqlAnywhere(SqlAnywhereVersions version)
{
if (saDriver == null)
{
try
{
File jarPath = "path\\to\\sajdbc4.jar";
URL jarUrl = new URL("jar:file:" + jarPath.getAbsolutePath() + "!/");
String driverClass = "sap.jdbc4.sqlanywhere.IDriver";
ucl = URLClassLoader.newInstance(new URL[]{ jarUrl });
saDriver = new DriverShim((Driver) Class.forName(driverClass, true, ucl).newInstance());
DriverManager.registerDriver(saDriver);
}
catch (Exception ex)
{
// Could not load SQL Anywhere driver
}
}
}
当应用程序运行时,SQL Anywhere 可以进行升级。因此,我需要完全卸载旧驱动程序,让更新发生,然后使用最新的 jar 文件进行初始化。我尝试过以下操作:
private static List<SqlSession> sessions = new ArrayList<>();
private static SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder();
public static final void unloadSqlAnywhere()
{
if (saDriver != null)
{
// Close out any existing sessions
for (SqlSession session : sessions)
{
session.close();
}
sessions.clear();
// Kill the session factory
sessionFactory = null;
try
{
DriverManager.deregisterDriver(saDriver);
saDriver = null;
ucl.close();
ucl = null;
}
catch (Exception ex)
{
// Failed to unregister SQL Anywhere driver
}
}
}
但是使用jprofiler,我可以看到DriverManager仍然在引用sap.jdbc4.sqlanywhere.IDriver
,这导致SQL Anywhere的升级终止了我的应用程序。
是否有更多的方法可以确保所有驱动程序引用都被删除?或者有更好的方式处理这个问题吗?
如果存在安全管理器并且其checkPermission拒绝权限,则会抛出SecurityException异常。
- mangusta