hefeixia
2021-02-18 5b8c95c760840f09910730943b21391e47187315
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package frame.persist;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Iterator;
 
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
 
import chat.server.Configer;
import chat.server.DTDResolver;
import chat.server.Loader;
import frame.util.Util;
import frame.variant.translator.Translator;
 
public class DatasuorceLoader extends Loader {
 
    private static DatasuorceLoader instance;
    
    private static final String Node_Defination = "defination";
    private static final String Node_Defination_DriverName = "driverName";
    private static final String Node_Defination_URL = "url";
    private static final String Node_Defination_UserName = "username";
    private static final String Node_Defination_Password = "password";
    
    public DatasuorceLoader() {
        path = Configer.getPath_Datasource();        
    }
    
    public static synchronized DatasuorceLoader getInstance() {
        if (instance == null) {
            instance = new DatasuorceLoader();
        }
        
        return instance;
    }
    
    public static void staticLoad() {
        getInstance();
        instance.load();
    }
    
    @Override
    public void load() {
        File file = new File(path);
        loadOneFile(file);        
    }
    
    private void loadOneFile(File file) {
        try {
            logger.debug("load datasource file:" + file);
            InputStream inputStream = new FileInputStream(file);
            
            try {
                SAXReader reader = new SAXReader();
                
                DTDResolver resolver = new DTDResolver(Configer.getPath_Config(), "datasource.dtd");
                reader.setEntityResolver(resolver);
                reader.setValidation(false);
                    
                Document doc = reader.read(inputStream);
                Element root = doc.getRootElement();
                    
                loadDefinations(root);
                    
            } catch (DocumentException e) {
                logger.error("can not load sql file: " + file);
                logger.error(e);
            } finally {
                try {
                    inputStream.close();
                } catch (IOException e) {
                }
            }
        }
        catch (Exception e) {
            logger.error(e);
        }        
    }
    
    private void loadDefinations(Element root) throws SQLException {
        Iterator<?> iterator = root.elementIterator(Node_Defination);
        
        while (iterator.hasNext()) {
            Element element = (Element) iterator.next();    
            
            String code = element.attributeValue("code");
            if (Util.isEmptyStr(code)) {
                code = "main";
            }
            
            boolean active = Translator.toBoolean(element.attributeValue("active"), true);
            
            if (!active) {
                continue;
            }
            
            String drivername = element.attributeValue(Node_Defination_DriverName);
            String url = element.attributeValue(Node_Defination_URL);
            String username = element.attributeValue(Node_Defination_UserName);
            String password = element.attributeValue(Node_Defination_Password);
            String validationQuery = element.attributeValue("validationQuery");
            
            NamedDataSource dataSource = new NamedDataSource(code);
            
            dataSource.setDriverClassName(drivername);
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            dataSource.setValidationQuery(validationQuery);
            
            dataSource.setInitialSize(1);
            dataSource.setFilters("stat,log4j");
            dataSource.setMaxWait(60000);
            dataSource.setMinIdle(1);
            dataSource.setTimeBetweenEvictionRunsMillis(3000);
            dataSource.setMinEvictableIdleTimeMillis(3000 * 500);
            dataSource.setRemoveAbandonedTimeout(300);
            dataSource.setTestWhileIdle(true);
            dataSource.setTestOnBorrow(false);
            dataSource.setTestOnReturn(false);
            
            DataSourceManager.appendDataSource(dataSource);
        }        
    }
 
}