總結一下遇到的問題,爲遇到同樣問題的同學提供些幫助。
SpringBoot部署到Weblogic後,發現DB的事務處理有問題。Debug程序發現程序的事務已經提交了,但要執行的SQL文沒有被執行到。
原來的SpringBoot的DB連接配置是Spring datasource到Oracle DB,事務也是Spring的。
部署到Weblogic後發現DB的數據怎麼都更新不了。
一通亂查,發現Weblogic的JTA管理是如下圖
看這個圖就能發現,程序只是把事務提交到了Weblogic的TM了。查了一下好像也不能關閉這個Weblogic的事務管理。
那也就只能把DB的配置在Weblogic來做,配置JNDI,修改SpringBoot的DB連接方式如下。
配置文件
spring:
datasource:
jndi-name: jdbc/abcd
weblogic:
url: 't3://localhost:7001'
jndiName: jdbc/abcd
webLogicName: weblogic
password: weblogic123
新建DataSource類
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jndi.JndiObjectFactoryBean;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration
public class DataSourceConfig {
@Value("${weblogic.url}")
private String webLogicUrl;
@Value("${weblogic.jndiName}")
private String weblogicJndiName;
@Value("${weblogic.webLogicName}")
private String weblogicLogicName;
@Value("${weblogic.password}")
private String weblogicPassword;
@Bean(name = "dataSource")
public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
properties.put(Context.PROVIDER_URL, webLogicUrl);
properties.put(Context.SECURITY_PRINCIPAL, weblogicLogicName);
properties.put(Context.SECURITY_CREDENTIALS, weblogicPassword);
bean.setJndiEnvironment(properties);
bean.setResourceRef(true);
bean.setJndiName(weblogicJndiName);
bean.setProxyInterface(DataSource.class);
bean.setLookupOnStartup(false);
bean.afterPropertiesSet();
return (DataSource) bean.getObject();
}
}
現在開始纔是坑
啓動項目,有Error,springboot .ClassNotFoundException: weblogic.jndi.WLInitialContextFactory
查網絡,說要加wlclient.jar和weblogic.jar,去Weblogic的Bin目錄下把Jar文件拷出來,加完後,又有下面的錯
spring oracle.jdbc.driver.T4CConnection cannot be cast to java.io.Serializable
再查網絡說要wlfullclient.jar,這個Jar,weblogic沒有啊,再查,原來是要自己做,參考下面的網址
https://docs.oracle.com/cd/E12839_01/web.1111/e13717/jarbuilder.htm#SACLT239
把wlfullclient.jar做好加項目裏面(可以把以上的wlclient.jar和weblogic.jar在項目去除)
又有新錯,
java.lang.NoSuchMethodError: javax.validation.BootstrapConfiguration.getClockProviderClassName()Ljava/lang/String
參考萬能的StackOverflow,降級hibernate-validator
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.2.Final</version>
</dependency>
再起動項目,終於沒有錯了,打開頁面,Debug一下更新DB,一切正常了。