Я хочу реализовать пул соединений в моем подключении jdbc с помощью jndi, но также хочу использовать расширенный объект BasicDataSource. У меня есть ограничение на использование tomcat 5.5. Требование состоит в шифровании-расшифровке пароля, предоставляемого в атрибутах контекстного ресурса jndi.Использование JNDI в расширенном объекте BasicDataSource
Я пытаюсь сделать что-то похожее на этот пост Link
Вот мой сервлет, который отлично работает без расширения BasicDataSource.
public class ReturnBlobOld extends HttpServlet {
private static final long serialVersionUID = 1L;
private org.apache.tomcat.dbcp.dbcp.BasicDataSource ds = null;
// this is my extended DS which is not working
//private custompages.NewBasicDataSource ds = null;
public void init(ServletConfig config) throws ServletException {
super.init(config);
getDataSource();
}
public void getDataSource() {
Context ctxt = null;
try {
ctxt = new InitialContext();
ds = (BasicDataSource) ctxt.lookup("java:comp/env/jdbc/mysql");
//ds = (NewBasicDataSource) ctxt.lookup("java:comp/env/jdbc/mysql");
ctxt.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
public void doGet(....){
........
Connection connection = null;
Statement statement = null;
ResultSet res = null;
try {
connection = ds.getConnection();
statement = connection.createStatement();
}
................
Вот мой расширенный класс BasicDataSource
package custompages;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
public class NewBasicDataSource extends BasicDataSource {
protected synchronized DataSource createDataSource() throws SQLException {
String decryptedPassword = decryptPassword(super.getPassword());
super.setPassword(decryptedPassword);
return super.createDataSource();
}
private String decryptPassword(String password) {
return "abcdef";//logic to decrypt current password
}
}
Вот мой context.xml файл
<context>
<Resource name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="abcdef"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.2.2:3306/world"
maxActive="1"
maxIdle="1"
maxWait="5000"
timeBetweenEvictionRunsMillis="5000"
minEvictableIdleTimeMillis="100"
removeAbandoned="true"
removeAbandonedTimeout="3"/>
</context>
Вот мой WEB-INF декларация ресурса
<resource-ref>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Мои сервлет работает отлично и Я могу инициализировать пул jdbc, используя вышеприведенный код. Но когда я пытаюсь использовать мой расширенный класс для шифрования -decrypting password, тогда я получаю исключение, как показано ниже.
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource
custompages.ReturnBlobOld.getDataSource(ReturnBlobOld.java:39)
custompages.ReturnBlobOld.init(ReturnBlobOld.java:32)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:881)
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:674)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:541)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
java.lang.Thread.run(Thread.java:595)
Пожалуйста, предложите правильный способ расширения этого класса для использования с JNDI