我有一段时间让 Jython 在 Tomcat (9) 下运行以对 JDBC 连接资源进行上下文查找。
我可以得到 InitialContext,但是当我尝试任何 .lookup() 时,我没有得到任何异常,但是之后的代码似乎都没有执行。
我在 server.xml 中有一个用于 JDBC 连接的全局命名资源,在 context.xml 中有一个 Context ResourceLink,这些适用于 Tomcat 下的其他纯 Java Web 应用程序。
我还尝试使用 zxJDBC 上下文查找函数,结果相同,基于此 [https://www.jython.org/jython-old-sites/archive/21/docs/zxjdbc.html][1]
ctx = InitialContext()
c = ctx.lookup("java:/comp/env")
# result = org.apache.naming.NamingContext@2ccbe380
t = ctx.list("java:comp/env")
# result = org.apache.naming.NamingContextEnumeration@19797ea4
if t.hasMore(): t.next().getName()
@ result = singe entry of "jdbc"
但是,以下查找尝试不返回任何内容,似乎导致所有剩余代码不执行,并且也没有抛出异常。奇怪!
ds = c.lookup("jdbc/UGOPS")
db = zxJDBC.lookup("jdbc/UGOPS", INITIAL_CONTEXT_FACTORY="com.sun.jndi.fscontext.RefFSContextFactory")
我完全不知道为什么在这些执行之后没有代码,也没有抛出异常。将这些注释掉,一切都会执行。
有没有人让这个工作并有一个例子,或者你能看到我做错了什么吗?
测试:getContext.py
import traceback
import sys
from javax.naming import Context
from javax.naming import InitialContext
from javax.naming import NamingException
from javax.servlet import ServletException
from javax.servlet.http import HttpServlet
from javax.servlet.http import HttpServletRequest
from javax.servlet.http import HttpServletResponse
from javax.sql import DataSource
from com.ziclix.python.sql import zxJDBC
class getContext( HttpServlet ) :
#------------------------------------------------------------------------------
def doGet( self, request, response ) :
self.doPost( request, response )
def doPost( self, request, response ) :
out = response.getWriter()
response.setContentType( "text/html" )
out.println( '<DOCTYPE HTML PUBLIC "-//WC3//DTD HTML 4.01 Transitional//EN">' )
out.println( '<html>' )
out.println( '<head>' )
out.println( '<meta name="generator" content="script">' )
out.println( '<title>' )
out.println( 'Test Tomcat InitialContext JNDI lookup' )
out.println( '</title>' )
out.println( '<base target="_self"/>' )
out.println( '</head>' )
out.println( '<body class="content">' )
out.println( '<div id="results">' )
try :
out.println('get context...')
ctx = InitialContext()
out.println('context env...')
c = ctx.lookup("java:/comp/env")
out.println(c)
# org.apache.naming.NamingContext@2ccbe380
out.println('context lookup...')
t = ctx.list("java:comp/env")
out.println(t)
# org.apache.naming.NamingContextEnumeration@19797ea4
# this produces a single .next() of 'jdbc'
if t.hasMore():
out.println('next')
out.println('<p></p>')
out.println('<p>' + t.next().getName() + '</p>')
# 'jdbc'
else:
out.println('none')
# this causes no exception but nothing else executes after this ?
ds = c.lookup("jdbc/UGOPS")
out.println('<p>get context JNDI...</p>')
jndiName = "jdbc/UGOPS"
factory = "com.sun.jndi.fscontext.RefFSContextFactory"
# try to use the zxJDBC context lookup
# this causes no exception but nothing else executes after this ?
db = zxJDBC.lookup(jndiName, INITIAL_CONTEXT_FACTORY=factory)
out.println('<p>got db...</p>')
out.print(db)
ctx.close()
except Exception, e :
out.println('Exception: ')
out.println('<p>')
out.println("e.message: " + e.message)
exc_type, exc_value, exc_traceback = sys.exc_info()
out.println(repr(traceback.format_exception(exc_type, exc_value, exc_traceback)) )
out.println('/p>')
out.println( "</body></html>" )
out.println( '</div>' )
out.println( '</body>' )
out.println( '</html>' )
server.xml 片段
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
<Resource name="jdbc/UGOPS" auth="Container" type="javax.sql.DataSource"
username="*******" password="*******"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;databaseName=UGOPS"
validationQuery="select 1"
poolPreparedStatements="true"/>
</GlobalNamingResources>
Context.xml 片段
<Context> -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<ResourceLink global="jdbc/UGOPS" name="jdbc/UGOPS" type="javax.sql.DataSource"/>
</Context>