我正在尝试从 Spring Boot 应用程序连接到 Sybase数据库。
我正在使用 JConnect jconn4 jdbc驱动程序。
Sybase服务器上的登录密码已加密,因此我使用 bouncycastle 加密API来加密密码。
以下是代码的块:
此代码使用普通JDBC 来测试连接,稍后我打算修改它以使用Spring的JDBCTemplate。
Connection con = null;
try {
Class.forName("com.sybase.jdbc4.jdbc.SybDriver");
logger.info("Loaded Sybase driver successfully.....");
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
和
String url = "jdbc:sybase:Tds:<url>:<port>/<databasename>";
Properties props = new Properties();
props.put("ENCRYPT_PASSWORD", "true");
props.put("JCE_PROVIDER_CLASS", "org.bouncycastle.jce.provider.BouncyCastleProvider");
props.put("user", "username");
props.put("password", "pwd");
和
con = DriverManager.getConnection(url, props);
登录成功进入Sybase服务器:
登录SybaseServer时失败:
我尝试了什么:
1.比较应用程序在运行时下使用的jar文件的版本,用于以下jars。因为多个版本相同jar文件存在于 classpath (来自各种依赖项)。
jconn4-7.07.jar
(sybase jdbc驱动程序)。
bcprov-jdk16-1.43.ja
r(bouncycastle crypto API)。
我使用下面的代码块来查找应用程序在运行时中使用的jar。
Class clazz = null;
try {
clazz = Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider");
logger.info("BouncyCastleProvider is ... " + clazz.toString());
if (clazz != null && clazz.getProtectionDomain() != null
&& clazz.getProtectionDomain().getCodeSource() != null) {
URL codeLocation = clazz.getProtectionDomain().getCodeSource().getLocation();
logger.info("BouncyCastleProvider jar is ... " + codeLocation.toString());
}
} catch (ClassNotFoundException e) {
logger.info(e.getMessage());
}
2.在eclipse中通过pom.xml的依赖 Hierarchy 窗口找到bcprov-jdk1x-x.xx.jar文件的 4个版本 '排除' pom中的三个文件。这是为了避免jar文件的版本 冲突。
但它不起作用: - (。
为什么它能够在Eclispe中连接而不是在作为WAR运行时连接?
任何帮助/方向都会非常有用。
答案 0 :(得分:1)
经过大量的研究并花费了近10个小时的努力,我可以通过在连接中添加“ CHARSET ”来解决这个问题属性。
props.put("CHARSET", "iso_1");
故事的道德:问题可能更大但解决方案不是: - )。