上下文是只读的

rub*_*nGL 6 java spring tomcat servlets jndi

Helo大师,我必须动态创建一个JNDI数据源,我试着用一个叫做SetupApplicationListener的监听器来做.这是开始WEB-LIB/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee">

    <display-name>pri-web</display-name>

    <!-- Listeners -->
    <listener>
        <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
    </listener>
    <listener>
        <listener-class>myapp.SetupApplicationListener</listener-class>
    </listener>
Run Code Online (Sandbox Code Playgroud)

听众的代码:

public class SetupApplicationListener implements ServletContextListener {

    public static Log LOG = null;

    public void contextInitialized(ServletContextEvent ctx){
        try {            
            createOracleDataSource();
.....
        }
    }

    private void createOracleDataSource() throws SQLException, NamingException {
        OracleDataSource ds = new OracleDataSource();
        ds.setDriverType(...);
        ds.setServerName(...);
        ds.setPortNumber(...);
        ds.setDatabaseName(...);
        ds.setUser(...);
        ds.setPassword(...);

        new InitialContext().bind("java:comp/env/jdbc/myDS", ds);
    }

.....
}
Run Code Online (Sandbox Code Playgroud)

并且有错误:

[ERROR] 29/01/2013 09:44:50,517 (SetupApplicationListener.java:86) -> Error
javax.naming.NamingException: Context is read only
    at org.apache.naming.NamingContext.checkWritable(NamingContext.java:903)
    at org.apache.naming.NamingContext.bind(NamingContext.java:831)
    at org.apache.naming.NamingContext.bind(NamingContext.java:171)
    at org.apache.naming.NamingContext.bind(NamingContext.java:187)
    at org.apache.naming.SelectorContext.bind(SelectorContext.java:186)
    at javax.naming.InitialContext.bind(InitialContext.java:359)
    at myapp.SetupApplicationListener.createOracleDataSource(SetupApplicationListener.java:102)
Run Code Online (Sandbox Code Playgroud)

我可以将Context的只读属性设置为"true"吗?谢谢!:)

Tomcat 6.0
Oracle 11g
jdk1.5
Run Code Online (Sandbox Code Playgroud)

编辑:不需要动态,我必须在内部定义一个jndi数据源我不能修改服务器文件,因为它是一个共享服务器.它必须是jndi,因为其他模块以这种方式使用它,谢谢.

Kev*_*sox 4

如果您需要动态创建数据源,真的需要 JNDI 查找吗?JNDI 旨在建立应用程序外部的连接,而在您的场景中,由于合法要求,它与应用程序紧密耦合。为什么不直接使用 JDBC 连接呢?