博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
solr dataimport 数据导入源码分析(九)
阅读量:5259 次
发布时间:2019-06-14

本文共 4615 字,大约阅读时间需要 15 分钟。

上文solr dataimport源码主要实现的是数据读取功能

下面我们接着看数据连接的实现的源码:

private Connection getConnection() 
throws Exception {
    
long currTime = System.currentTimeMillis();
    
if (currTime - connLastUsed > CONN_TIME_OUT) {
      
synchronized (
this) {
        Connection tmpConn = factory.call();
        closeConnection();
        connLastUsed = System.currentTimeMillis();
        
return conn = tmpConn;
      }
    } 
else {
      connLastUsed = currTime;
      
return conn;
    }

  } 

这里用到了synchronized关键字,使对
成员变量
conn访问
线程安全 
其中factory 是一个Callable<Connection>类型的对象,是在初始化方法里面产生的

 java的Callable接口定义如下

public 
interface Callable<V> {
    V call() 
throws Exception;

 factory 初始化

public 
void init(Context context, Properties initProps) {
//
其他代码略
    factory = createConnectionFactory(context, initProps);
}

接下来看createConnectionFactory(context, initProps) 代码如下

  protected Callable<Connection> createConnectionFactory(final Context context,

                                       
final Properties initProps) {
//
    final VariableResolver resolver = context.getVariableResolver();
    resolveVariables(context, initProps);
    
final String jndiName = initProps.getProperty(JNDI_NAME);
    
final String url = initProps.getProperty(URL);
    
final String driver = initProps.getProperty(DRIVER);
    
if (url == 
null && jndiName == 
null)
      
throw 
new DataImportHandlerException(SEVERE,
              "JDBC URL or JNDI name has to be specified");
    
if (driver != 
null) {
      
try {
        DocBuilder.loadClass(driver, context.getSolrCore());
      } 
catch (ClassNotFoundException e) {
        wrapAndThrow(SEVERE, e, "Could not load driver: " + driver);
      }
    } 
else {
      
if(jndiName == 
null){
        
throw 
new DataImportHandlerException(SEVERE, "One of driver or jndiName must be specified in the data source");
      }
    }
    String s = initProps.getProperty("maxRows");
    
if (s != 
null) {
      maxRows = Integer.parseInt(s);
    }
    
return factory = 
new Callable<Connection>() {
      
public Connection call() 
throws Exception {
        LOG.info("Creating a connection for entity "
                + context.getEntityAttribute(DataImporter.NAME) + " with URL: "
                + url);
        
long start = System.currentTimeMillis();
        Connection c = 
null;
        
try {
          
if(url != 
null){
            c = DriverManager.getConnection(url, initProps);
          } 
else 
if(jndiName != 
null){
            InitialContext ctx =  
new InitialContext();
            Object jndival =  ctx.lookup(jndiName);
            
if (jndival 
instanceof javax.sql.DataSource) {
              javax.sql.DataSource dataSource = (javax.sql.DataSource) jndival;
              String user = (String) initProps.get("user");
              String pass = (String) initProps.get("password");
              
if(user == 
null || user.trim().equals("")){
                c = dataSource.getConnection();
              } 
else {
                c = dataSource.getConnection(user, pass);
              }
            } 
else {
              
throw 
new DataImportHandlerException(SEVERE,
                      "the jndi name : '"+jndiName +"' is not a valid javax.sql.DataSource");
            }
          }
        } 
catch (SQLException e) {
          
//
 DriverManager does not allow you to use a driver which is not loaded through
          
//
 the class loader of the class which is trying to make the connection.
          
//
 This is a workaround for cases where the user puts the driver jar in the
          
//
 solr.home/lib or solr.home/core/lib directories.
          Driver d = (Driver) DocBuilder.loadClass(driver, context.getSolrCore()).newInstance();
          c = d.connect(url, initProps);
        }
        
if (c != 
null) {
          
if (Boolean.parseBoolean(initProps.getProperty("readOnly"))) {
            c.setReadOnly(
true);
            
//
 Add other sane defaults
            c.setAutoCommit(
true);
            c.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
            c.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT);
          }
          
if (!Boolean.parseBoolean(initProps.getProperty("autoCommit"))) {
            c.setAutoCommit(
false);
          }
          String transactionIsolation = initProps.getProperty("transactionIsolation");
          
if ("TRANSACTION_READ_UNCOMMITTED".equals(transactionIsolation)) {
            c.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
          } 
else 
if ("TRANSACTION_READ_COMMITTED".equals(transactionIsolation)) {
            c.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
          } 
else 
if ("TRANSACTION_REPEATABLE_READ".equals(transactionIsolation)) {
            c.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
          } 
else 
if ("TRANSACTION_SERIALIZABLE".equals(transactionIsolation)) {
            c.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
          } 
else 
if ("TRANSACTION_NONE".equals(transactionIsolation)) {
            c.setTransactionIsolation(Connection.TRANSACTION_NONE);
          }
          String holdability = initProps.getProperty("holdability");
          
if ("CLOSE_CURSORS_AT_COMMIT".equals(holdability)) {
            c.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT);
          } 
else 
if ("HOLD_CURSORS_OVER_COMMIT".equals(holdability)) {
            c.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
          }
        }
        LOG.info("Time taken for getConnection(): "
                + (System.currentTimeMillis() - start));
        
return c;
      }
    };
  }

这里负责生成Connection对象

转载于:https://www.cnblogs.com/chenying99/archive/2012/09/10/2677188.html

你可能感兴趣的文章
20169214 2016-2017-2 《移动平台开发实践》大项目——创意提现 · 需求分析
查看>>
C#根据IP地址和子网掩码计算广播地址
查看>>
对Servlet容器的补充和一个问题的请教
查看>>
第六周项目复审
查看>>
unity游戏框架学习-SDK接入
查看>>
面向对象设计与构造课程作业 _第三单元总结 _北京航空航天大学计算机学院 2019春季...
查看>>
API HOOK(MessageBoxA)
查看>>
css盒子模型
查看>>
初学JS——利用JS制作的别踩白块儿(街机模式) 小游戏
查看>>
python 基础篇 16 递归和二分数查找与编码补充回顾
查看>>
linux技巧总结之--tar文件的批量加压
查看>>
在MyEclipse中几种开发框架的搭建
查看>>
hdu.5203.Rikka with wood sticks(数学推导:一条长度为L的线段经分割后可以构成几种三角形)...
查看>>
物联网MQTT协议分析和开源Mosquitto部署验证
查看>>
Android中GridView拖拽的效果
查看>>
LeetCode - Climbing Stairs
查看>>
剑指Offer - 九度1369 - 字符串的排列
查看>>
加载时添加一个遮罩层
查看>>
with 语句
查看>>
个人作业1——四则运算题目生成程序
查看>>