当前位置: 首页 > 知识库问答 >
问题:

Quarkus如何指定JNDI数据源

鲜于温书
2023-03-14

我正在评估Quakus是否可以替代Tomcat环境。我理解我正在尝试做的工作所面临的挑战,但我首先需要验证我现有的遗留JSP应用程序是否可以使用Quarkus工作。我正在使用quarkus。undertow作为我的servlet容器。

到目前为止,我已经克服了几个障碍。我现在遇到的问题是如何使用我的数据源。

目前,我们的数据源在Tomcat的server.xmlGlobalNamingResources中设置,并在Web应用程序的META-INF/context.xml中绑定为ResourceLinks。

我已将数据源设置传输到Quarkus的应用程序。性质如下:

quarkus.datasource.menudb.url=jdbc:mysql://some.server.url/menuadmin
quarkus.datasource.menudb.driver=com.mysql.cj.jdbc.Driver
quarkus.datasource.menudb.username=web
quarkus.datasource.menudb.password=<password>

我从文档中了解到,这是实现它的方法。但是,文档随后显示注入数据源:

@Inject
@DataSource("users")
AgroalDataSource dataSource1;

在我的例子中,我将在注释中用我的数据源名称menudb替换用户。但是,我有一些需要重用的数据访问类,这些类创建InitialContext,使用传入的JNDI资源名称查找数据源,并创建数据源:

InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/<jndi name>");
conn = ds.getConnection();

这导致以下错误:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at com.gy.obj.ContextManager.contextInitialized(ContextManager.java:367)
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:188)
...

最初的研究让我想到了Apache Camel,但乍一看,这似乎不是一个合适的解决方案。我也读过关于设置jndi的内容。属性如下:

# Needed env settings for JNDI.
java.naming.factory.initial=<Some JNDI Service Provider Name>

但是我不确定使用哪个提供商,到目前为止,似乎无法在各个提供商上找到留档。

我的问题是,我是否至少在正确的轨道上,我会使用什么提供商?如果我没有太多,我真的不想用我现有的数据访问类来提供注入。然而,我并不反对像我们目前为Tomcat配置的那样。

共有1个答案

雍焱
2023-03-14

有意不支持JNDI,因为我们认为它是不必要的复杂性,这在Quarkus模型中没有用:没有运行时部署,所有代码在构建时都是已知的,因此不需要这种解耦。

解决方案很简单:只需调整代码,使其不从JDNI上下文中查找,而是从CDIBeanManager中查找。

虽然我们能够支持大多数高级API,但移植现有应用程序应该很容易,但不要假设将提供所有遗留技术——现在是摆脱一些并继续前进的好时机。

也就是说,我认为JNDI很容易被模仿,但到目前为止,我们更愿意避免这种情况;如果这对您非常重要,请随时打开一个问题。

 类似资料:
  • 为了从web应用程序获取DB连接,我在web应用程序中编写了以下代码: 早些时候,我使用Tomcat作为服务器,当我在文件中配置资源详细信息时,我能够获得DB连接,但当我使用开始使用weblogic server时,我得到以下错误: 我已经尝试了这个链接中提到的选项:如何在WebLogic上查找JNDI资源?但我仍然面临着问题。 请让我知道我在哪里做错误,访问JNDI对象的过程是什么。

  • 问题内容: 我已经使用Weblogic控制台创建了JNDI数据源,但无法从Web应用程序访问该对象。以下是详细信息 在weblogic 10.3.6中,我为数据源指定了JNDI名称: 为了从Web应用程序获得数据库连接,我已经在Web应用程序中编写了以下代码: 之前我使用Tomcat作为服务器,当我在文件中配置资源详细信息时能够获得数据库连接tomcat/conf/server.xml,但是当我开

  • 问题内容: 在有关类的Spring javadoc文章中,该类非常简单,建议使用 使用容器提供的JNDI数据源。这样DataSource可以通过DataSourceSpring ApplicationContext中的bean 形式公开。 问题是:我该如何完成? 例如,如果我希望让访问我的自定义MySQL数据库,那我需要什么?我应该在上下文配置等中写些什么? 问题答案: 如果使用基于Spring

  • 我想用Spring Boot配置JNDI数据源 我知道可以在application.properties.中使用以下内容创建jndi。我在纠结的是如何将其与JBoss WildFly联系起来? a.我需要在WildFly的standalone.xml下添加/更改什么和b. Spring Boot主应用程序类ProjectPocApiApplication下需要的任何更改 谢谢

  • 问题内容: 我正在使用Websphere Portal 7.0并使用RAD 8.0创建一个portlet。我的portlet试图建立到远程服务器的db2连接。我在本地编写了一个Java程序来与服务器建立基本的JDBC连接,并从表中获取记录。代码工作正常;但是,当我将代码以及db2jcc4.jar添加到我的portlet时,连接不起作用。我正在使用基本的: 我认为使用Websphere数据源是正确的

  • EJB 3.0提供了定义数据库实体关系/映射的选项,如一对一,一对多,多对一和多对多关系。 以下是相关注释 - One-to-One - 对象具有一对一的关系。 例如,乘客可以一次使用单张票。 One-to-Many - 对象具有一对多的关系。 例如,父亲可以有多个孩子。 Many-to-One - 对象具有多对一关系。 例如,多个孩子有一个单身母亲。 Many-to-Many - 对象具有多对多