我正在使用在 tomcat 服务器中配置的 JNDI 数据源。我想避免将密码存储为明文,而且我在使用的应用程序中有一个现有的加密逻辑,我想用它来加密数据库密码。
<Resource name="jdbc/testdb" auth="Container"
factory="com.zaxxer.hikari.HikariJNDIFactory"
type="javax.sql.DataSource"
minimumIdle="5"
maximumPoolSize="50"
connectionTimeout="300000"
driverClassName="org.mariadb.jdbc.Driver"
jdbcUrl="jdbc:mysql://localhost:3307/testdb"
dataSource.implicitCachingEnabled="true"
connectionTestQuery="Select 1" />
考虑到这个用例和在线可用的可能解决方案,我决定使用 org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter 来使用代码为数据库提供用户名和密码
<bean id="dataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/testdb" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter">
<property name="targetDataSource" ref="dataSource1"/>
<property name="username" value="${dataSource.username}"/>
<property name="password" value="#{passwordDecryptor.decryptedString}"/>
</bean>
这种方法适用于我与 MSSQL 数据库建立连接,但奇怪的是在 MariaDB 上失败,并出现错误“访问被拒绝用户''@'localhost'(使用密码:NO)”。我想知道这个问题是否与 HikariCP 连接池有关,因为同样适用于 C3P0 实现,没有任何问题。
另外我想知道这是否是正确的方法,请建议这是否可以改进以获得更好的性能。