如何将 Spring Boot JAR 连接到远程 Oracle 数据库?

Posted

技术标签:

【中文标题】如何将 Spring Boot JAR 连接到远程 Oracle 数据库?【英文标题】:How do I connect a Spring Boot JAR to a remote Oracle database? 【发布时间】:2017-02-10 03:08:58 【问题描述】:

我有一个使用 Spring 4.3.6 和 Spring Boot 1.4.4 的应用程序,当作为 WAR 部署到 WebLogic 12c 服务器时,它能够通过 JNDI 连接连接到 Oracle 数据库。

我现在需要创建现有项目的修改版本,该版本可以导出为带有嵌入式 Tomcat 服务器的独立 JAR。如何从 JAR 中连接到同一个数据库?

这是当前 WAR 应用程序的当前 Eclipse 目录(类路径为 src):

WAR Project
 |  src
 |   |  main.java
 |   |   |  controllers
 |   |   |   |  BasicController.java
 |   |   |   |  CrudController.java
 |   |   |  Application.java
 |   |  META-INF
 |   |   |  resources
 |   |   |   |  form.html
 |  JRE System Library [JDK 1.7]
 |  Referenced Libraries
 |  lib
 |   |  compile
 |   |  runtime
 |  resources
 |   |  application.properties
 |  target
 |  WEB-INF
 |   |  classes
 |   |  weblogic.xml
 |  build_war.xml

build_war.xml 是用于将应用程序导出到 WAR 的 Ant 构建文件。 form.html 是一个静态网页。

这是我现有的代码:

@SpringBootApplication
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer 
  public static void main(String[] args) 
    SpringApplication.run(Application.class, args);
  

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 
  return application.sources(Application.class);
  


@Controller
public class BasicController 
  @RequestMapping("/")
  public String goToForm() 
    return "form.html";
  


@RestController
public class CrudController 
  @Autowired
  private JdbcTemplate jdbcTemplate;

  @PostMapping("/result")
  public String sampleQuery(@RequestParam String tableName, @RequestParam String colNameSet,
      @RequestParam String valueSet) 
    String query = "INSERT INTO " + tableName + " (" + colNameSet + ") VALUES " + valueSet;
    try 
      jdbcTemplate.update(query);
     catch (Exception e) 
      e.printStackTrace();
      query = e.toString();
    
    return query;
  

application.properties只有一行:

spring.datasource.jndi-name=database.jndi.name

数据库网址是jdbc:oracle:thin@ip-address:port-number:orcl

应用程序可以作为 WAR 成功连接和更新数据库。我需要更改哪些内容才能连接到与独立 JAR 相同的数据库?

我在 Google 上找不到任何提及与我的问题相关的任何参考资料或教程。请引导我了解我到底需要修改什么以及如何修改。谢谢!

编辑

要添加有关此应用程序的更多信息:My Oracle 数据库包含一个表 PEOPLE,其中包含以下列:

ID  INT  NOT NULL,
NAME  VARCHAR(20)  NOT NULL,
AGE  INT  NOT NULL,
PRIMARY KEY (ID)

form.htmlsampleQuery() 提交一个 POST 请求,然后sampleQuery() 从表单输入中提交一个数据库查询。

当应用部署为WAR并通过JNDI连接数据库时,数据库查询执行成功。

但是,根据 shi 的回答修改application.properties 后:

spring.datasource.url=jdbc:oracle:thin:@ip-address:port:orcl
spring.datasource.username=user-name
spring.datasource.password=password

当我在 Eclipse 中作为 Java 应用程序运行时引发以下错误:

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [INSERT INTO PEOPLE (ID,NAME,AGE) VALUES ('2','Momo','21')]; nested exception is java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: PEOPLE
at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:91)
...
at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: PEOPLE
...
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
...
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:408)
... 53 more
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: PEOPLE
at org.hsqldb.error.Error.error(Unknown Source)
...
at org.hsqldb.Session.execute(Unknown Source)
... 58 more

发生了什么?

【问题讨论】:

这只是给了我org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.jdbc.core.JdbcTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: @org.springframework.beans.factory.annotation.Autowired(required=true) 请分享你的 pom.xml 或 ant xml 【参考方案1】:

DataSource 配置由 spring.datasource.* 中的外部配置属性控制。例如,您可以在 application.properties 中声明以下部分:

spring.datasource.url=jdbc:thin://url:port/service
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.Oracle.OracleDriver

参考:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html

【讨论】:

您没有在 application.properties 中添加 Oracle 驱动程序,为此您需要在类路径中添加 ojdbc7 jar。但是 maven 的存储库中没有 Oracle 驱动程序。要手动添加它,请按照以下步骤操作:springframework.guru/configuring-spring-boot-for-oracle

以上是关于如何将 Spring Boot JAR 连接到远程 Oracle 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 AWS Elasticache Redis 集群连接到 Spring Boot 应用程序?

如何将我的 Spring Boot 应用程序连接到 Docker 上的 Redis 容器?

无法使用 Spring Boot 应用程序连接到 Docker 映像

如何将 Angular 9 登录页面连接到 Spring Boot 应用程序?

如何将 Docker 内部的 Spring Boot 应用程序连接到 PostgreSQL 外部

如何使用 Spring Boot jwt 将身份验证系统连接到 React.js