Jython を Tomcat (9) の下で実行して、JDBC 接続リソースのコンテキスト ルックアップを実行するのにかなりの時間を費やしています。
InitialContext を取得できますが、.lookup() を試行しても例外は発生しませんが、その後のコードは実行されないようです。
server.xml には JDBC 接続用のグローバル名前付きリソースがあり、context.xml には Context ResourceLink があります。これらは、Tomcat の下の他の純粋な Java Web アプリケーションで機能します。
この [https://www.jython.org/jython-old-sites/archive/21/docs/zxjdbc.html][1] に基づいて、同じ結果で zxJDBC コンテキスト ルックアップ関数も使用してみました。
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>