2013-06-10 2 views
0

Я хочу реализовать пул соединений в моем подключении 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

ответ

0

Ok, Вот альтернатива я делаю сейчас. Я удалил ресурс JNDI и создал новый объект BasicDataSource непосредственно в своем сервлетах вместо того, чтобы получать его из вызова метода фабрики JNDI. Для настройки может быть я могу параметризовать свойства с помощью файла свойств?

public void getDataSource() { 

     ds = new BasicDataSource(); 
     ds.setDriverClassName("com.mysql.jdbc.Driver"); 
     ds.setUsername("root"); 
     ds.setPassword("abcde"); 
     ds.setUrl("jdbc:mysql://192.168.2.2:3306/world"); 
     ds.setMaxActive(8); 
     ds.setMaxIdle(8); 
     ds.setMaxWait(10000); 
     ds.setTimeBetweenEvictionRunsMillis(300000); 
     ds.setMinEvictableIdleTimeMillis(1800000); 
     ds.setRemoveAbandonedTimeout(300); 
     ds.setRemoveAbandoned(true); 
Смежные вопросы