通过 TNS 连接到 Oracle 无法正常工作

2023-12-08

我有一个 Spring Boot 应用程序,当它以经典方式连接到 Oracle 实例时,它可以顺利运行:

jdbc:oracle:thin:@<server name>:<port num>/<service name>

但是,当我通过存储在本地驱动器“C:\ORACLE\Client11g\network\admin”中的 tnsnames.ora 通过 tns 进行连接时,某些内容不起作用,并且出现以下异常:

Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:267)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:231)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:210)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:240)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:210)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:858)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:885)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579)
    ... 36 more
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
    at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100)
    at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:257)
    ... 52 more

10:37:32,201 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 381) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./my_service: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./my_service: java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [app/persistence/OracleConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [app/persistence/OracleConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:236)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82)
    ... 6 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [app/persistence/OracleConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:151)
    at org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:131)
    at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:86)
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169)
    at io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:186)
    at io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:171)
    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:234)
    ... 8 more

以下是我的 application.properties + application-oracleprod.properties 文件。请记住,当我使用 SID 连接(如前所述)时,此方法有效。

应用程序属性:

spring.profiles.active=oracleprod

spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.jpa.hibernate.ddl-auto=validate
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update
hibernate.generate_statistics=true

application-oracleprod.properties(这里应该发生魔法,因为这个属性“oracle.net.tns_admin”设置了“tnsnames.ora”文件夹以及链接“@MY_SERVICE”,它显然存在于“tnsnames.ora”文件中,但我真的不明白 Oracle 在幕后做了什么):

spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

#/tnsnames.ora
oracle.net.tns_admin=C:/ORACLE/Client11g/network/admin

oracle.username=my_user
oracle.password=xyz
oracle.url=jdbc:oracle:thin:@MY_SERVICE

Configuration 类简洁明了:

@Configuration
@ConfigurationProperties(prefix="oracle" )
public class OracleConfiguration {

    @NotNull
    private String username;

    @NotNull
    private String password;

    @NotNull
    private String url;

    /*@Value("${oracle.net.tns_admin}")
    private String tns;*/

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    /*public void setTns(String tns) {
        this.tns = tns;
    }*/

    @Bean
    DataSource dataSource() throws SQLException {
        OracleDataSource dataSource = new OracleDataSource(); // we use oracle data source API but it could be mysql
        dataSource.setURL(this.url);
        dataSource.setUser(this.username);
        dataSource.setPassword(this.password);
        dataSource.setImplicitCachingEnabled(true);
        dataSource.setFastConnectionFailoverEnabled(true);
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        try {
            em.setDataSource(dataSource());
        } catch (SQLException e) {
            e.printStackTrace();
        }

        em.setPackagesToScan(new String[] { "app.persistence.entity" }); // put the name of entity classes package 

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);

        //em.setJpaProperties(additionalProperties()); // this properties are set by "application-oracle.properties" file

        return em;
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {

        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

总而言之,我遵循了 Oracle 文档中建议的方法并结合 Spring Boot 配置文件/类,但没有成功。

我还尝试了不同的路径格式:

C:/ORACLE/Client11g/network/admin/tnsnames.ora
C:\ORACLE\Client11g\network\admin
C:\\ORACLE\\Client11g\\network\\admin

我认为我做得很好,因为使用 SID 连接一切都很完美,但可能缺少一些隐藏的东西。

UPDATE

事实证明,数据库 url 不正确,至少对于 TNS 连接而言是这样。问题是我们有多个主机,而不仅仅是一个主机:

    MY_SERVICE =
  (DESCRIPTION_LIST =
    (LOAD_BALANCE = off)
    (FAILOVER = on)
    (DESCRIPTION =
      (CONNECT_TIMEOUT = 5)
      (TRANSPORT_CONNECT_TIMEOUT = 3)
      (RETRY_COUNT = 3)
      (ADDRESS_LIST =
        (LOAD_BALANCE = on)
        (ADDRESS = (PROTOCOL = TCP)(HOST = <ip_1> )(PORT = 1621))
        (ADDRESS = (PROTOCOL = TCP)(HOST = <ip_2> )(PORT = 1621))
      )
      (CONNECT_DATA =
        (SERVICE_NAME = <my_service_name>)
      )
    )
    (DESCRIPTION =
      (CONNECT_TIMEOUT = 5)
      (TRANSPORT_CONNECT_TIMEOUT = 3)
      (RETRY_COUNT = 3)
      (ADDRESS_LIST =
        (LOAD_BALANCE = on)
        (ADDRESS = (PROTOCOL = TCP)(HOST = <ip_3> )(PORT = 1621))
        (ADDRESS = (PROTOCOL = TCP)(HOST = <ip_4> )(PORT = 1621))
      )
      (CONNECT_DATA =
        (SERVICE_NAME = <my_service_name> )
      )
    )
  )

我得到了:

 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    Caused by: java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    Caused by: org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
    Caused by: java.sql.SQLRecoverableException: Errore di I/O: Unknown host specified 
    Caused by: oracle.net.ns.NetException: Unknown host specified "

再次,我有点困惑如何告诉 Spring 如何读取这个 TNS 配置。

任何想法?


由于某种原因,对我来说只起作用:

spring.datasource.url=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=TODO)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=TODO)))

代替spring.datasource.url=jdbc:oracle:thin:@MY_SERVICE.

另外,我正在调用用户 M. Deinum 在接受的答案中建议的方法 certainAndSetTnsHome() :

public static void main(String[] args) {
        SpringApplication.run(EvaApplication.class, args);
        determineAndSetTnsHome();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 TNS 连接到 Oracle 无法正常工作 的相关文章

随机推荐

  • 通过传递引用或返回引用来初始化结构是更好的方式吗?

    假设我有以下内容 typedef struct int x int y char a char b myStruct 创建一个新的更好的做法吗 myStruct通过传递对空函数的引用或返回一个函数来使用函数myStruct来自函数 void
  • 正则表达式在特定位置添加空格

    我有一个 14 位长的号码 需要将其拆分成以下格式 xxx xxx xxx xxxxx 我有一个正则表达式 它从末尾开始分割每 3 个字符 因为前瞻 d 3 d 这给了我 xx xxx xxx xxx xxx 我尝试在 regex101 c
  • 在 R 的行组中向前和向后进行最后一个因子观察

    假设我的数据集看起来像 ID Name 1 JAY 1 1 JAY 2 LAY 2 LAY 2 3 NA 3 KAY 3 我想根据组中已有的观察结果用缺失值 空或 NA 填充行 所以结果数据框看起来像 ID Name 1 JAY 1 JAY
  • 无法移出定义“Drop”特征的类型 [E0509]

    我使用以下 Rust 代码Rust Postgres打算在我的结构超出范围后提交事务 struct SqlTransaction lt a gt connection a Connection transaction Transaction
  • 使用 OpenGL 进行快速调色板屏幕块传输

    游戏使用软件渲染在内存中绘制全屏调色板 8 位 图像 使用 OpenGL 将图像显示在屏幕上的最快方法是什么 我尝试过的事情 glDrawPixels with glPixelMap指定调色板 并让 OpenGL 进行调色板映射 性能非常糟
  • HttpRuntime.Cache 在哪里存储数据?

    我正在尝试实现一个具有缓存功能的 Web 应用程序 我需要缓存的原因是我们有一个允许用户访问在线课程的应用程序 现在 一旦用户登录 我就会根据我们的数据库对其进行验证 一旦验证 我想将用户 ID 和课程 ID 在缓存中存储 20 分钟 这样
  • Safari XHR 上传卡住(有时)

    我使用构建上传脚本jquery 文件上传 现在我有一个奇怪的行为 上传时不时地卡住 假设每八次 这只发生在 Safari 5 0 5 中 其他浏览器工作正常 我可以确认这与服务器无关 该问题发生在执行任何服务器脚本之前 有时上传卡在 2 有
  • 来自命令行的 Sublime Text

    我安装了 Sublime Text 并想知道如何打开rb从终端获取其中的文件 我看见让 Sublime Text 成为我的核心编辑器的命令是什么 我发现我可以将 Sublime 作为我的核心编辑器 但我希望能够输入 sublime file
  • 在Python中存储布尔值以节省内存的最佳方法

    在字典 如由长数字索引的集合 中存储一百万到 450 000 个布尔值的最佳方法是什么 我需要使用尽可能少的内存 True 和 Int 每个条目都占用超过 22 个字节 每个布尔值的内存是否可能较低 Check 这个问题 Bitarray似
  • 将子文件夹重定向到根目录并将其隐藏在 url 中

    我已经成功地从目录中 重新设置 根目录 以便将公共文件与配置 帮助程序和控制器分开 这要归功于这个答案 and 这个答案 但是我意识到如果用户输入http domain com public它不会重定向到http domain com这对
  • 当 float 指针类型转换为 char 指针时会发生什么?

    int main float f 12 2 char p1 p1 char f printf d p1 输出 51 You can cast a float to a char 很好 就是using这样的野兽可能会有问题 当您取消引用它时
  • Struts 2 中的下拉菜单

    我有一张带有键值对的地图 我想在下拉列表中显示键 并将值发送到服务器以识别所选内容 我使用的是Struts2 我尝试把Map in
  • 使用过滤器更改 UITextView 链接的颜色?

    UITextView 上检测到的链接始终为蓝色 没有办法直接改变这一点 但是我可以叠加某种将蓝色变为红色的滤镜吗 实际上有一种方法可以做到这一点使用私有 API A UITextView有一个 单个 类子视图UIWebDocumentVie
  • 如何比较两个 char[] 数组是否相等?

    现在我有两个char数组 foo1 and foo2 当我将它们转换为字符串并输出到控制台时 它们都显示为bar 我知道我可以做这样的事情 int g for int i 0 i
  • 如何添加到 ASP.NET HttpRequest 客户端可用的密码套件?

    当我的 ASP NET 网站在 Windows 7 机器上运行时 它可以很好地连接 以编程方式作为 客户端 到另一台 Windows 7 计算机上的 SSL 加密服务 服务器 但如果我的网站位于生产环境 Windows Server 200
  • htaccess和重写

    我刚刚在我的网站上创建了一个子域 主要是因为我想要一个特定的地址 可以说我的网站是 http website com我的子域是http sub website com其主文件夹位于 home username public html sub
  • 在 C# 中将像素数组转换为图像

    我有一个数组int我的 C 程序中存在像素 我想将其转换为图像 问题是我正在将程序的 Java 源代码转换为等效的 C 代码 在java中 该行读取将int像素数组显示到图像中 Image output createImage new Me
  • 无需内联汇编即可访问标志?

    我在 C 中有以下方法 它需要两个 16 位短整型 将两个整数相加 如果设置了进位标志 则结果加 1 对最终结果中的所有位取反 NOT 返回结果 short declspec naked getchecksum short s1 short
  • setWindowFlag(Qt::Dialog | Qt::WindowStaysOnTopHint) 在 Centos 上不起作用

    我正在打开一个表单窗口 并希望无论它是否聚焦 都始终将其保留在顶部 我正在使用此功能setWindowFlags Qt Dialog Qt WindowStaysOnTopHint QT 的它在 Mac 上工作正常 正如我所希望的 但是当我
  • 通过 TNS 连接到 Oracle 无法正常工作

    我有一个 Spring Boot 应用程序 当它以经典方式连接到 Oracle 实例时 它可以顺利运行 jdbc oracle thin