如何将 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 数据库?的主要内容,如果未能解决你的问题,请参考以下文章