Lotus и MySQL (jdbc)

Тема в разделе "Lotus + Java + LS2J", создана пользователем turumbay, 20 апр 2009.

  1. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    вроде работающий агент:

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Код"</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    import lotus.domino.*;
    import java.util.Vector;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.ResultSet;

    public class JavaAgent extends AgentBase {

    public void NotesMain() {

    try {
    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();

    // (Your code goes here)
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;

    try {
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    } catch (Exception ex) {
    System.out.println("SQLException: " + ex.getMessage());

    }


    try {
    conn = DriverManager.getConnection("jdbc:mysql://server/dbname?user=USER&password=PASSWORD");
    } catch (SQLException ex) {
    System.out.println("On connect SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
    }
    System.out.println("Connection Created");
    try {
    stmt = conn.createStatement();
    // Создаем временные таблицы
    // 1. Наличие товара на складах по датам
    String cutOffDate = "2006-10-16"; // дата отсечения
    String tmpTableQuery = "CREATE TEMPORARY TABLE T1(guid integer, storeuid integer, days integer) SELECT guid, storeuid, count(distinct(storedate)) AS days FROM stores WHERE storedate>'"+cutOffDate+"' GROUP BY guid, storeuid ";
    try {
    stmt.executeUpdate(tmpTableQuery);
    } catch(SQLException ex) {
    System.out.println("Creating t1... SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
    }
    // 2. Текущее состояние складов
    tmpTableQuery = "CREATE TEMPORARY TABLE T2(guid integer, storeuid integer, amount integer) SELECT guid,storeuid, sum(amount) AS amount FROM stores WHERE storedate = (SELECT MAX(storedate) FROM stores) GROUP BY guid, storeuid";
    try {
    stmt.executeUpdate(tmpTableQuery);
    } catch(SQLException ex) {
    System.out.println("Creating t2... SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
    }
    // 3. Продажи по датам
    tmpTableQuery = "CREATE TEMPORARY TABLE T3(guid integer, storeuid integer, amount integer) SELECT guid, storeuid, sum(amount) AS amount FROM buystore WHERE indoccreatedate>'"+cutOffDate+"' GROUP BY guid, storeuid";
    try {
    stmt.executeUpdate(tmpTableQuery);
    } catch(SQLException ex) {
    System.out.println("Creating t3... SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
    }
    // ацкий JOIN
    String joinQuery = "SELECT t1.*,goodslist.goodname, IFNULL(t2.amount,0) AS onstore, IFNULL(t3.amount,0) AS sold, ";
    joinQuery = joinQuery + "IFNULL(t3.amount,0)/t1.days AS avrg, IFNULL(t3.amount,0)/t1.days-IFNULL(t2.amount,0) AS ness FROM t1 ";
    joinQuery = joinQuery + "LEFT JOIN t2 ON t1.guid=t2.guid AND t1.storeuid=t2.storeuid ";
    joinQuery = joinQuery + "LEFT JOIN t3 ON t1.guid=t3.guid AND t1.storeuid=t3.storeuid ";
    joinQuery = joinQuery + "LEFT JOIN goodslist ON t1.guid=goodslist.guid ";
    joinQuery = joinQuery + "WHERE IFNULL(t3.amount,0)/t1.days-IFNULL(t2.amount,0) >0 ";
    joinQuery = joinQuery + "ORDER BY IFNULL(t3.amount,0)/t1.days-IFNULL(t2.amount,0)";

    try {
    rs = stmt.executeQuery(joinQuery);
    } catch(SQLException ex) {
    System.out.println("on JOIN SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());

    }
    Database db = agentContext.getCurrentDatabase();
    Document doc = db.createDocument();
    doc.appendItemValue("Form", "ProductReport");
    Vector vguid = new Vector();
    Vector vgoodname = new Vector();
    Vector vstoreuid = new Vector();
    Vector vonstore = new Vector();
    Vector vtobuy = new Vector();
    while (rs.next()) {
    // retrieve and print the values for the current row
    Integer guid = new Integer(rs.getInt("guid"));
    Integer storeuid = new Integer(rs.getInt("storeuid"));
    Integer onstore = new Integer(rs.getInt("onstore"));
    Float tobuy = new Float(rs.getFloat("ness"));
    vguid.addElement(guid);
    vgoodname.addElement(rs.getString("goodname"));
    vstoreuid.addElement(storeuid);    
    vonstore.addElement(onstore);  
    vtobuy.addElement(tobuy);
    }
    doc.appendItemValue("guid",vguid);
    doc.appendItemValue("goodname",vgoodname);
    doc.appendItemValue("storeuid", vstoreuid);
    doc.appendItemValue("onstore", vonstore);
    doc.appendItemValue("tobuy", vtobuy);
    doc.save();
    } finally {
    if (rs != null) {
    try {
    rs.close();
    } catch(SQLException ex) {}
    rs = null;
    } //if
    if (stmt != null) {
    try {
    stmt.close();
    } catch(SQLException ex) {}
    stmt = null;
    } //if
    } //finally


    } catch(Exception e) {
    e.printStackTrace();
    }
    }
    }
    в яве не силен - за качество кода сильно не пинайте...
     
  2. vincent_vega

    vincent_vega Lotus team
    Lotus team

    Регистрация:
    2 апр 2005
    Сообщения:
    165
    Симпатии:
    1
    Вместо множества try {} catch () лучше использовать один блок для всего кода. И я бы еще очень посоветовал в блоке finally для всех нотесовских объектов делать recycle(). Домино не очень хорошо следит за использованием памяти:)
     
  3. dopler123

    dopler123 Гость

    Возможно кому-то поможет.
    На Линуксовом сервере с лотусом, sql коннектор завелся после того как положил коннектор.jar в lib/ext.
    Прописывание пути к конектору в Classpath не помогает.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Коннектор к mysql</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>import java.sql.*;

    void initbase() {
    odbcName = "cfg_odbcname";
    odbcUserName = "cfg_odbcusername";
    odbcPassword = "cfg_odbcpassword";

    try {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:eek:dbc:" + odbcName, odbcUserName, odbcPassword);
    }
    catch (Exception e) {
    e.printStackTrace();
    }
    }[/CODE]
     
  4. susinmn

    susinmn Well-Known Member

    Регистрация:
    16 окт 2007
    Сообщения:
    530
    Симпатии:
    8
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">тоже код)</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    import lotus.domino.*;
    import java.sql.*;

    public class JavaAgent extends AgentBase {
    static Connection con;
    static Statement stmt;
    static ResultSet rs;

    public void NotesMain() {
    try {
    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();

    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://ip_server:server_port/dbname", "user", "пароль");
    Statement stmt = con.createStatement();
    ResultSet rs=stmt.executeQuery("select * from test"); //в Sybase хранимку дергаю, так же как и select exec название проц. параметры через запятую
    //ResultSet rs=stmt.executeQuery("exec prc_find_client '21160', '036-810/09ю', 252");
    while (rs.next()) {
    long s = rs.getLong(1); //здесь задаешь тип 1 колонки
    long n = rs.getLong(2); //здесь задаешь тип 2 колонки

    System.out.println(s + "  " + n);
    }
    //close all resources
    stmt.close();
    con.close();
    } catch(Exception e) {
    e.printStackTrace();
    System.out.println("что-то не получилось(");
    }
    }
    }
     
  5. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Привет всем еще раз, в общем ситуация следующая:
    Я написал класс на JAVA по работе с MySQL, и провел тестирование на платформе windows и linux, результат был следующим:
    на винде все прошло 100% успешно и проблем ни каких не возникло, а вот на линухе проблема появилась с кодировкой как ее можно решить? вместо русских символов "?"

    делал вот так, не помогло
    SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'
     
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    всю схему взаимодействия опишите:
    -где стоит мускуль (платформа)
    -где стоит скрипт выбора из БД
    -где сам код
     
  7. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Сервера MySQL и Lotus и все скрипты стоят на Linux


    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Класс MySQL на JAVA</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.ResultSet;

    class jMySQL {
    private String name = "MySQL [JAVA]";
    private Statement stmt = null;
    private ResultSet rs = null;
    private Connection conn = null;
    private boolean DriverLoaded = false;
    private boolean Connected = false;
    private boolean SQL_EXEC = false;

    private void Print(String Text){
    System.out.println(name + ": " + Text);
    }

    public boolean InstallCharSet(String CharSetName)
    {
    try
    {
    if (!Connected)
    {
    Print("[InstallCharSet]: Не выполнено подключение!");
    return false;
    }
    String SQL_CHAR = "SET character_set_results = '"+CharSetName+"', character_set_client = '"+CharSetName+"', character_set_connection = '"+CharSetName+"', character_set_database = '"+CharSetName+"', character_set_server = '"+CharSetName+"'";
    stmt = conn.createStatement();
    stmt.executeUpdate(SQL_CHAR);
    return false;
    } catch (Exception e) {
    Print("[InstallCharSet]: " + e.getMessage());
    return false;
    }
    }

    public void GetMySQLInfo()
    {
    try
    {
    String SQLS = "SHOW VARIABLES";
    stmt = conn.createStatement();
    stmt.execute(SQLS);
    rs = stmt.getResultSet();
    } catch (Exception e) {
    Print("-[GetMySQLInfo]---------------------------------------------");
    e.printStackTrace();
    }

    }

    public String real_escape_string(String SQLTEXT)
    {
    if (SQLTEXT.isEmpty())
    {
    return "";
    }

    if (SQLTEXT.replaceAll("[a-zA-Z0-9_!@#$%^&*()-=+~.;:,\\Q[\\E\\Q]\\E<>{}\\/? ]","").length() < 1)
    {
    return SQLTEXT;
    }

    String clean_string = SQLTEXT;
    clean_string = clean_string.replaceAll("\\\\", "\\\\\\\\");
    clean_string = clean_string.replaceAll("\\n","\\\\n");
    clean_string = clean_string.replaceAll("\\r", "\\\\r");
    clean_string = clean_string.replaceAll("\\t", "\\\\t");
    clean_string = clean_string.replaceAll("\\00", "\\\\0");
    clean_string = clean_string.replaceAll("'", "\\\\'");
    clean_string = clean_string.replaceAll("\\\"", "\\\\\"");

    return clean_string;
    }

    private boolean LoadDriver(){
    try {
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    DriverLoaded = true;
    }
    catch (Exception ex)
    {
    DriverLoaded = false;
    }
    return DriverLoaded;
    }

    public boolean Connect(String Host, String DataBase, String Login, String Password) {
    if (Host.trim() == "" || DataBase.trim() == "" || Login.trim() == "" || Password.trim() == "")
    {
    Print("[Connect] Проверьте все ли параметры указаны!");
    return false;
    }
    if (DriverLoaded != true){
    Print("[Connect] Драйвер не загружен!");
    Connected = false;
    return false;
    }
    try {
    conn = DriverManager.getConnection("jdbc:mysql://"+Host+"/"+DataBase+"?user="+Login+"&password="+Password);
    Connected = true;
    return true;
    }
    catch (SQLException ex)
    {
    Print("[Connect]: " + ex.getMessage() + " " + ex.getErrorCode());
    Connected = false;
    return false;
    }
    }

    public boolean GetConnection(){

    return Connected;
    }

    public boolean SQLExec(String Query){
    if (!Connected)
    {
    Print("[SQLExec]: Не выполнено подключение!");
    return false;
    }
    SQL_EXEC = false;
    try {
    stmt = conn.createStatement();
    if (stmt.execute(Query)) {
    rs = stmt.getResultSet();
    SQL_EXEC = true;
    return true;
    } else
    {
    SQL_EXEC = false;
    return false;
    }
    } catch (Exception ex) {
    SQL_EXEC = false;
    Print("[SQLExec]: " + ex.getMessage());
    return false;
    }
    }

    public boolean Disconnect(){
    try
    {
    rs.close();
    return true;
    } catch (Exception ex) {
    Print("[Disconnect]: " + ex.getMessage());
    return false;
    }
    }

    public ResultSet Result() {
    if (!SQL_EXEC) {
    return null;
    } else
    {
    return rs;
    }
    }

    public jMySQL() {
    try
    {
    LoadDriver();
    }
    catch (Exception ex)
    {
    Print("[jMySQL]: " + ex.getMessage());
    }
    }

    }

    ну и часть кода выгрузки данных из Lotus'а в MySQL
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">ExportDep</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
        private void ExportDep(Database db) {
    Document doc;
    View view;
    try {
    Print("[OK] - Составление списка управлений из модуля Шлюз...!");
    /* Фиксируем время начало выполнения агента */
    view = db.getView("depByName");
    Print("[OK] - Найдено документов: " + view.getEntryCount());
    if (view.getEntryCount() == 0)
    {
    Print("[W] - Не найдено ни одного управления, завершение выполнение агента!");
    return;
    }
    /* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
    Print("[OK] - Очистка таблицы MySQL...!");
    SQL = "TRUNCATE TABLE `dep_list`";
    SQLEXECR = MySQL.SQLExec(SQL);
    Print("[OK] - Очистка завершена!");
    Print("[OK] - Начинаем выгрузку данных в MySQL...");
    /* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
    doc = view.getFirstDocument();

    while (doc != null) {
    /* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
    String dep_id = doc.getItemValueString("fDUnid");
    String dep_name = doc.getItemValueString("fDName");
    String dep_namekz = doc.getItemValueString("fDNameKZ");

    String dep_address = doc.getItemValueString("fDAddress");
    String dep_leader = doc.getItemValueString("fDLeader");
    String dep_leader_contact = doc.getItemValueString("fDLeader_ContactInfo");
    String dep_leader_email = doc.getItemValueString("fDLeader_ContactEmail");
    String dep_citizen = doc.getItemValueString("fDCitizen_FIO");
    String dep_citizen_contact = doc.getItemValueString("fDCitizen_ContactInfo");
    String dep_sort_id = doc.getItemValueString("fDSortID").trim();

    dep_sort_id = dep_sort_id.isEmpty()?"300":dep_sort_id;


    /* Экранизация данных - предотвращает ошибки при отправки SQL запросов */
    dep_name = MySQL.real_escape_string(dep_name);
    dep_namekz = MySQL.real_escape_string(dep_namekz);
    dep_address = MySQL.real_escape_string(dep_address);
    dep_leader_contact = MySQL.real_escape_string(dep_leader_contact);
    dep_leader_email = MySQL.real_escape_string(dep_leader_email);
    dep_citizen_contact = MySQL.real_escape_string(dep_citizen_contact);


    /* Подготовка SQL Запроса */
    SQL = "INSERT INTO `dep_list` " +
    "(`dep_id`,`dep_name`,`dep_namekz`,`dep_address`,`" +
    "dep_leader`,`dep_leader_contact`,`dep_leader_email`,`dep_citizen`," +
    "`dep_citizen_contact`,`dep_sort_id`)";
    SQL += "VALUES(";
    SQL +=  "'"+dep_id+"','"+dep_name+"','"+dep_namekz+"','"+dep_address+"'," +
    "'"+dep_leader+"','"+dep_leader_contact+"','"+dep_leader_email+"','"+dep_citizen+"'," +
    "'"+dep_citizen_contact+"', '"+dep_sort_id+"')";

    /* Отправка запроса */
    SQLEXECR = MySQL.SQLExec(SQL);
    /* Получаем следующий документ */
    doc = view.getNextDocument(doc);
    }
    MySQL.SQLExec(SQL);
    Print("[OK] - Запись в таблицу обновлений внесена!");
    Print("[OK] - Выполнение синхронизации завершено!");
    Print("------------------------------------------------------------------");
    } catch (Exception e) {
    Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
    e.printStackTrace();
    }
    }
     
  8. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Ситуация следующая:
    Имеется Lotus сервер и MySQL сервер на Linux, Lotus с интервалом 2 часа выполняет выгрузку данных в MySQL выполняет выгрузку 5000+ записей и начинает выбивать в консоль ошибку OutOfMemoryError:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Текст с консоли</div></div><div class="sp-body"><div class="sp-content">
    06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP006I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" - please wait.
    06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Snap dump using '/var/lib/notes/data/Snap.20120622.103207.1909.0001.trc' in response to an event
    06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP010I Snap dump written to /var/lib/notes/data/Snap.20120622.103207.1909.0001.trc
    06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Snap dump using '/var/lib/notes/data/Snap.20120622.103207.1909.0002.trc' in response to an event
    06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP010I Snap dump written to /var/lib/notes/data/Snap.20120622.103207.1909.0002.trc
    06/22/2012 10:32:07 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Heap dump using '/var/lib/notes/data/heapdump.20120622.103207.1909.0003.phd' in response to an event
    06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP010I Heap dump written to /var/lib/notes/data/heapdump.20120622.103207.1909.0003.phd
    06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Java dump using '/var/lib/notes/data/javacore.20120622.103207.1909.0005.txt' in response to an event
    06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP010I Java dump written to /var/lib/notes/data/javacore.20120622.103207.1909.0005.txt
    06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP013I Processed dump event "systhrow", detail "java/lang/OutOfMemoryError".
    06/22/2012 10:32:09 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Heap dump using '/var/lib/notes/data/heapdump.20120622.103207.1909.0004.phd' in response to an event
    06/22/2012 10:32:11 AM Agent Manager: Agent error: JVMDUMP010I Heap dump written to /var/lib/notes/data/heapdump.20120622.103207.1909.0004.phd
    06/22/2012 10:32:11 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Java dump using '/var/lib/notes/data/javacore.20120622.103207.1909.0006.txt' in response to an event
    06/22/2012 10:32:12 AM Agent Manager: Agent error: JVMDUMP010I Java dump written to /var/lib/notes/data/javacore.20120622.103207.1909.0006.txt
    06/22/2012 10:32:12 AM Agent Manager: Agent error: JVMDUMP006I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" - please wait.
    06/22/2012 10:32:12 AM Agent Manager: Agent error: JVMDUMP032I JVM requested Snap dump using '/var/lib/notes/data/Snap.20120622.103211.1909.0007.trc' in response to an event
    06/22/2012 10:32:12 AM Agent Manager: Agent error: JVMDUMP010I Snap dump written to /var/lib/notes/data/Snap.20120622.103211.1909.0007.trc
     
  9. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Хм... странновато...
    Но по идее не должно быть.... может где-то в коде ошибка?
    Про такие ошибки ТУТ что-то пишут
     
  10. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Память у JVM не резиновая, об она и сообщила... Причиной обычно является либо утечка памяти, либо попытка накидать на кучу данных, превышающих ее размер. Вы часом не пытаетесь все 5k записей пихать в какую-нить java collection?

    Вариантов решения ровно два: увеличить JavaMaxHeapSize в notes.ini, либо исправлять код.

    P.S. JVM при OutOfMemoryError сбрасывает dump кучи (тот самый .phd из крэш-лога), который можно посмотреть на предмет того, куда девалась память. Для этого есть например Eclipse Memory Analyzer ( aka MAT ) и плагин к нему для работы с дампами ibm.
     
  11. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    JavaMaxHeapSize не нашел, но есть HTTPJVMMaxHeapSize это одно и тоже или нет?

    Насчет кода вот он:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Собственно сам класс по работе с MySQL</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.ResultSet;

    class jMySQL {
    private String name = "MySQL [JAVA]";
    private Statement stmt = null;
    private ResultSet rs = null;
    private Connection conn = null;
    private boolean DriverLoaded = false;
    private boolean Connected = false;
    private boolean SQL_EXEC = false;

    private void Print(String Text){
    System.out.println(name + ": " + Text);
    }

    public boolean InstallCharSet(String CharSetName)
    {
    try
    {
    if (!Connected)
    {
    Print("[InstallCharSet]: Не выполнено подключение!");
    return false;
    }
    String SQL_CHAR = "SET character_set_results = '"+CharSetName+"', character_set_client = '"+CharSetName+"', character_set_connection = '"+CharSetName+"', character_set_database = '"+CharSetName+"', character_set_server = '"+CharSetName+"'";
    stmt = conn.createStatement();
    stmt.executeUpdate(SQL_CHAR);
    return false;
    } catch (Exception e) {
    Print("[InstallCharSet]: " + e.getMessage());
    return false;
    }
    }

    public void GetMySQLInfo()
    {
    try
    {
    String SQLS = "SHOW VARIABLES";
    stmt = conn.createStatement();
    stmt.execute(SQLS);
    rs = stmt.getResultSet();
    SQL_EXEC = true;
    } catch (Exception e) {
    Print("-[GetMySQLInfo]---------------------------------------------");
    e.printStackTrace();
    }

    }

    public String real_escape_string(String SQLTEXT)
    {
    if (SQLTEXT.isEmpty())
    {
    return "";
    }

    if (SQLTEXT.replaceAll("[a-zA-Z0-9_!@#$%^&*()-=+~.;:,\\Q[\\E\\Q]\\E<>{}\\/? ]","").length() < 1)
    {
    return SQLTEXT;
    }

    String clean_string = SQLTEXT;
    clean_string = clean_string.replaceAll("\\\\", "\\\\\\\\");
    clean_string = clean_string.replaceAll("\\n","\\\\n");
    clean_string = clean_string.replaceAll("\\r", "\\\\r");
    clean_string = clean_string.replaceAll("\\t", "\\\\t");
    clean_string = clean_string.replaceAll("\\00", "\\\\0");
    clean_string = clean_string.replaceAll("'", "\\\\'");
    clean_string = clean_string.replaceAll("\\\"", "\\\\\"");

    return clean_string;
    }

    private boolean LoadDriver(){
    try {
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    DriverLoaded = true;
    }
    catch (Exception ex)
    {
    DriverLoaded = false;
    }
    return DriverLoaded;
    }

    public boolean Connect(String Host, String DataBase, String Login, String Password) {
    if (Host.trim() == "" || DataBase.trim() == "" || Login.trim() == "" || Password.trim() == "")
    {
    Print("[Connect] Проверьте все ли параметры указаны!");
    return false;
    }
    if (DriverLoaded != true){
    Print("[Connect] Драйвер не загружен!");
    Connected = false;
    return false;
    }
    try {
    conn = DriverManager.getConnection("jdbc:mysql://"+Host+"/"+DataBase+"?user="+Login+"&password="+Password);
    Connected = true;
    return true;
    }
    catch (SQLException ex)
    {
    Print("[Connect]: " + ex.getMessage() + " " + ex.getErrorCode());
    Connected = false;
    return false;
    }
    }

    public boolean GetConnection(){

    return Connected;
    }

    public boolean SQLExec(String Query){
    if (!Connected)
    {
    Print("[SQLExec]: Не выполнено подключение!");
    return false;
    }
    SQL_EXEC = false;
    try {
    stmt = conn.createStatement();
    if (stmt.execute(Query)) {
    rs = stmt.getResultSet();
    SQL_EXEC = true;
    return true;
    } else
    {
    SQL_EXEC = false;
    return false;
    }
    } catch (Exception ex) {
    SQL_EXEC = false;
    Print("[SQLExec]: " + ex.getMessage());
    return false;
    }
    }

    public boolean Disconnect(){
    try
    {
    rs.close();
    return true;
    } catch (Exception ex) {
    Print("[Disconnect]: " + ex.getMessage());
    return false;
    }
    }

    public ResultSet Result() {
    if (!SQL_EXEC) {
    return null;
    } else
    {
    return rs;
    }
    }

    public jMySQL() {
    try
    {
    LoadDriver();
    }
    catch (Exception ex)
    {
    Print("[jMySQL]: " + ex.getMessage());
    }
    }

    }
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">И агент</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    import lotus.domino.*;
    import java.util.*;
    import java.io.PrintWriter;
    import java.text.*;

    public class MySQLExport extends AgentBase {
    jMySQL MySQL = new jMySQL();   
    String AgentName = "Export2SQL";
    String SQL = "";
    int NCount = 0;

    boolean SQLEXECR = false;

    /* Получить текущую дату */
    private String getDateTime(String format) {
    format = format.isEmpty()?"dd.MM.yyyy hh:mm:ss":format;
    DateFormat dateFormat = new SimpleDateFormat(format);
    Date date = new Date();
    return dateFormat.format(date);
    }

    /* метод для конверации даты в дату в формате UNIX */
    private long StrToDateUnix(String datatime, String format)
    {
    try
    {
    format = format.isEmpty()?"dd.MM.yyyy hh:mm:ss":format;
    DateFormat formatter = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss");
    Date date2 = formatter.parse(datatime);
    return (long)date2.getTime() / 1000L;
    } catch (Exception e) {
    return -1;
    }
    }

    /* Аналог функции Print в LS */
    private void Print(String Text){
    System.out.println(AgentName + ": " +Text);
    }

    private void ExportNotice(Database db) {
    Document doc;
    View view;
    try {
    Print("[OK] - Поиск уведомлений в модуле Шлюз...!");
    view = db.getView("noticesByUniqueNum");
    NCount = view.getEntryCount();
    Print("[OK] - Найдено уведомлений: " + NCount);
    if (NCount == 0)
    {
    Print("[W] - Не найдено ни одного докумета, завершение выполнение агента!");
    return;
    }
    /* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
    Print("[OK] - Очистка таблицы уведомлений в MySQL...!");
    SQL = "TRUNCATE TABLE `notice`";
    SQLEXECR = MySQL.SQLExec(SQL);
    Print("[OK] - Очистка завершена!");
    Print("[OK] - Начинаем выгрузку уведомлений в MySQL...");
    /* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
    doc = view.getFirstDocument();

    while (doc != null) {
    /* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
    String fnRegNum = doc.getItemValueString("fnRegNum");
    String fnSendet = doc.getItemValueString("fnSendet");
    long fnDataTime = StrToDateUnix( doc.getItemValueString("fnDataTime"), "");
    String fnDepID = !doc.getItemValueString("fnDepID").isEmpty()?doc.getItemValueString("fnDepID").trim():"0";
    String fnDepIDTo = !doc.getItemValueString("fnDepIDTo").isEmpty()?doc.getItemValueString("fnDepIDTo").trim():"0";
    String fnOrganization = doc.getItemValueString("fnOrganization");
    String fnAppName = doc.getItemValueString("fnAppName");
    String fnAppEmail = doc.getItemValueString("fnAppEmail");
    String fnAppMPhone = doc.getItemValueString("fnAppMPhone");
    String fnCategory = !doc.getItemValueString("fnCategory").isEmpty()?doc.getItemValueString("fnCategory").trim():"0";
    String fNStatIndex = !doc.getItemValueString("fNStatIndex").isEmpty()?doc.getItemValueString("fNStatIndex").trim():"0";
    String fNStatText = doc.getItemValueString("fNStatText");
    long fNStatExpire = StrToDateUnix( doc.getItemValueString("fNStatExpire") + " 00:00:00", "");
    String fnExName = doc.getItemValueString("fnExName");
    String fnExPost = doc.getItemValueString("fnExPost");
    String fnUniqNum = doc.getItemValueString("fnUniqNum");
    long fnCreateTime = StrToDateUnix( doc.getItemValueString("fnCreateTime"), "");

    /* Экранизация данных - предотвращает ошибки при отправки SQL запросов */
    fnRegNum = MySQL.real_escape_string(fnRegNum);
    fnOrganization = MySQL.real_escape_string(fnOrganization);
    fnAppName = MySQL.real_escape_string(fnAppName);
    fnAppEmail = MySQL.real_escape_string(fnAppEmail);
    fNStatText = MySQL.real_escape_string(fNStatText);
    fnExPost = MySQL.real_escape_string(fnExPost);
    fnExName = MySQL.real_escape_string(fnExName);
    fnUniqNum = MySQL.real_escape_string(fnUniqNum);


    /* Подготовка SQL Запроса */
    SQL = "INSERT INTO `notice` " +
    "(`fnRegNum`,`fnSendet`,`fnDataTime`,`" +
    "fnDepID`,`fnDepIDTo`,`fnOrganization`,`fnAppName`," +
    "`fnAppEmail`,`fnAppMPhone`,`fnCategory`,`fNStatIndex`," +
    "`fNStatText`,`fNStatExpire`,`fnExName`,`fnExPost`,`fnUniqNum`, `fnCreateTime`)";
    SQL += "VALUES(";
    SQL +=  "'"+fnRegNum.trim()+"','"+fnSendet.trim()+"','"+fnDataTime+"'," +
    "'"+fnDepID.trim()+"','"+fnDepIDTo.trim()+"','"+fnOrganization.trim()+"','"+fnAppName.trim()+"'," +
    "'"+fnAppEmail.trim()+"','"+fnAppMPhone.trim()+"','"+fnCategory.trim()+"','"+fNStatIndex.trim()+"'," +
    "'"+fNStatText.trim()+"','"+fNStatExpire+"','"+fnExName.trim()+"','"+fnExPost.trim()+"','"+fnUniqNum.trim()+"', '"+fnCreateTime+"')";

    /* Отправка запроса */
    /*Print(SQL); */
    SQLEXECR = MySQL.SQLExec(SQL);
    /* Получаем следующий документ */
    doc = view.getNextDocument(doc);
    }
    Print("[OK] - Экспорт уведомлений завершен!");
    Print("------------------------------------------------------------------");
    } catch (Exception e) {
    Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
    e.printStackTrace();
    }
    }

    private void ExportDep(Database db) {
    Document doc;
    View view;
    try {
    Print("[OK] - Составление списка управлений из модуля Шлюз...!");
    view = db.getView("depByName");
    Print("[OK] - Найдено документов: " + view.getEntryCount());
    if (view.getEntryCount() == 0)
    {
    Print("[W] - Не найдено ни одного управления, завершение выполнение агента!");
    return;
    }
    /* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
    Print("[OK] - Очистка таблицы MySQL...!");
    SQL = "TRUNCATE TABLE `dep_list`";
    SQLEXECR = MySQL.SQLExec(SQL);
    Print("[OK] - Очистка завершена!");
    Print("[OK] - Начинаем выгрузку данных в MySQL...");
    /* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
    doc = view.getFirstDocument();

    while (doc != null) {
    /* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
    String dep_id = doc.getItemValueString("fDUnid");
    String dep_name = doc.getItemValueString("fDName");
    String dep_namekz = doc.getItemValueString("fDNameKZ");

    String dep_address = doc.getItemValueString("fDAddress");
    String dep_leader = doc.getItemValueString("fDLeader");
    String dep_leader_contact = doc.getItemValueString("fDLeader_ContactInfo");
    String dep_leader_email = doc.getItemValueString("fDLeader_ContactEmail");
    String dep_citizen = doc.getItemValueString("fDCitizen_FIO");
    String dep_citizen_contact = doc.getItemValueString("fDCitizen_ContactInfo");
    int dep_sort_id = (int) doc.getItemValueInteger("fDSortID");

    dep_sort_id = dep_sort_id <=0?300:dep_sort_id;


    /* Экранизация данных - предотвращает ошибки при отправки SQL запросов */
    dep_name = MySQL.real_escape_string(dep_name);
    dep_namekz = MySQL.real_escape_string(dep_namekz);
    dep_address = MySQL.real_escape_string(dep_address);
    dep_leader_contact = MySQL.real_escape_string(dep_leader_contact);
    dep_leader_email = MySQL.real_escape_string(dep_leader_email);
    dep_citizen_contact = MySQL.real_escape_string(dep_citizen_contact);


    /* Подготовка SQL Запроса */
    SQL = "INSERT INTO `dep_list` " +
    "(`dep_id`,`dep_name`,`dep_namekz`,`dep_address`,`" +
    "dep_leader`,`dep_leader_contact`,`dep_leader_email`,`dep_citizen`," +
    "`dep_citizen_contact`,`dep_sort_id`)";
    SQL += "VALUES(";
    SQL +=  "'"+dep_id+"','"+dep_name+"','"+dep_namekz+"','"+dep_address+"'," +
    "'"+dep_leader+"','"+dep_leader_contact+"','"+dep_leader_email+"','"+dep_citizen+"'," +
    "'"+dep_citizen_contact+"', '"+dep_sort_id+"')";

    /* Отправка запроса */
    SQLEXECR = MySQL.SQLExec(SQL);
    /* Получаем следующий документ */
    doc = view.getNextDocument(doc);
    }
    MySQL.SQLExec(SQL);
    Print("[OK] - Запись в таблицу обновлений внесена!");
    Print("[OK] - Экспорт списка управлений завершен!");
    Print("------------------------------------------------------------------");
    } catch (Exception e) {
    Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
    e.printStackTrace();
    }
    }

    private void ExportStatus(Database db) {
    Document doc;
    View view;
    try {
    Print("[OK] - Составление списка статусов из модуля Шлюз...!");
    view = db.getView("vInf_Status");
    Print("[OK] - Найдено статусов: " + view.getEntryCount());
    if (view.getEntryCount() == 0)
    {
    Print("[W] - Не найдено ни одного статуса, завершение выполнение агента!");
    return;
    }
    /* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
    Print("[OK] - Очистка таблицы MySQL...!");
    SQL = "TRUNCATE TABLE `status_list`";
    SQLEXECR = MySQL.SQLExec(SQL);
    Print("[OK] - Очистка завершена!");
    Print("[OK] - Начинаем выгрузку данных в MySQL...");
    /* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
    doc = view.getFirstDocument();

    while (doc != null) {
    /* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
    String status_id = doc.getItemValueString("fSUid");
    String status_name = doc.getItemValueString("fSNameRU");
    String status_namekz = doc.getItemValueString("fSNameKZ");


    /* Подготовка SQL Запроса */
    SQL = "INSERT INTO `status_list` " +
    "(`status_id`,`status_name`,`status_namekz`)";
    SQL += "VALUES(";
    SQL +=  "'"+status_id+"','"+status_name+"','"+status_namekz+"')";

    /* Отправка запроса */
    SQLEXECR = MySQL.SQLExec(SQL);
    /* Получаем следующий документ */
    doc = view.getNextDocument(doc);
    }
    MySQL.SQLExec(SQL);
    Print("[OK] - Экспорт статусов завершен!");
    Print("------------------------------------------------------------------");
    } catch (Exception e) {
    Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
    e.printStackTrace();
    }
    }
    /* Основной инициируемый метод */
    public void NotesMain() {
    PrintWriter PW=getAgentOutput();
    /* Фиксируем время начало выполнения агента */
    long StartTime = System.currentTimeMillis() / 1000;
    Session session = getSession();
    try {
    /* Выполнение */
    Print("[!] - Инициализция агенте синхронизации с MySQL сервером!" );

    Database db = session.getAgentContext().getCurrentDatabase();
    Print("[!] - Получение настроек агента!" );
    Document profile = db.getProfileDocument("fProfile", "");

    if (profile == null)
    {
    Print("[!] - Проверьте настройки в базе!" );
    return;
    }

    String Run = profile.getItemValueString("fPMysqlEnabled");
    String Login = profile.getItemValueString("fPMysqlLogin");
    String Password = profile.getItemValueString("fPMysqlPassword");
    String DBName = profile.getItemValueString("fPMysqlDataBaseName");
    String Host = profile.getItemValueString("fPMysqlHost");

    if (Run.isEmpty())
    {
    Print("[!] - Агент отключен. Проверьте настройки в базе!" );
    return;
    }

    boolean cnt = MySQL.Connect(Host, DBName, Login, Password);
    if (!cnt)
    {
    Print("[ER] - Не удалось соедениться с сервером MySQL. Продробности об ошибке смотрете в логах сервера!");
    return;
    }

    Print("[OK] - Платформа: " + System.getProperty("os.name"));
    Print("[OK] - Соединение с MySQL сервером прошло успешно!");

    /* Экспорт статусов */
    ExportStatus(db);
    /* Экспорт списка управлений */
    ExportDep(db);
    /* Экспорт формы уведомлений */
    ExportNotice(db);

    /* UNIX время завершения выполнения агента */
    long EndTime = System.currentTimeMillis() / 1000;


    long CurrentDate = StrToDateUnix(getDateTime("dd.MM.yyyy") + " 00:00:00", "");

    SQL = "INSERT INTO `notice_update` (`date_update`, `last_update`, `start_update`, `recordcount`) VALUES ('"+CurrentDate+"', '"+StartTime+"','"+EndTime+"','"+NCount+"')";
    MySQL.SQLExec(SQL);

    SQL = "INSERT INTO notice_logupdate (`day_id`,`start_time`, `end_time`, `recordcount`) VALUES ('"+CurrentDate+"', '"+StartTime+"', '"+EndTime+"', '"+NCount+"') " +
    "ON DUPLICATE KEY UPDATE start_time='"+StartTime+"', end_time='"+EndTime+"', recordcount='"+NCount+"'";

    MySQL.SQLExec(SQL);
    Print("[OK] - Синхронизация успешно завершена");
    PW.println("Content-type: text/plain; charser: utf-8");
    PW.println("OK");

    } catch (Exception e) {
    Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
    e.printStackTrace();
    }
    }
    }
    Добавлено:
    а какой размер по умолчанию?
     
  12. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Вроде цикл правильный...

    Попробовать бы сделать recycle()..

    И вообще из 3-х методов Export_ выделил бы общую часть - общий метод, куда и цикл бы вынес. И вконце метода добавил бы
    <!--shcode--><pre><code class='java'>finally {
    doc.recycle();
    view.recycle();
    }[/CODE]Если будет падать, то наверное надо с памятью играться. Больше идей у меня нет.

    Добавлено:
    И что-то бы придумал, чтобы SQL-запрос автоматом формировался, а не такой ужас... Например готовить HashMap("имя поля в Лотус") = "имя поля в mySql" или 2 Vector'а (векторы из Лотуса легче получить) и вбрасывать в метод. Так понятнее было бы.
     
  13. Кирилл Шваб

    Кирилл Шваб Well-Known Member

    Регистрация:
    30 июн 2006
    Сообщения:
    144
    Симпатии:
    4
    RixPvl,
    Открой дамп и посмотри кто съел всю память с помощью IBM Heap Analyzer или как советует turumbay с помощью Eclipse Memory Analyzer.
    IBM Heap Analyzer просто меньше по размеру - всего 5 Мб.
    Нет.

    JavaMaxHeapSize - максимальный размер памяти, которую может использовать JVM (виртуальная машина Java) задачи Agent Manager, отвечающей в том числе за запуск агентов в контексте клиента (т.е. запускаемые при работе в клиенте или на сервере).

    HTTPJVMMaxHeapSize - максимальный размер памяти, которую может использовать JVM задачи HTTP, отвечающей в том числе за запуск агентов в контексте веба (т.е. запускаемые при работе в веб)
    Для JavaMaxHeapSize в 8.5 по умолчанию идет 64 Мб. Подробности в лотусовой вики: http://www-10.lotus.com/ldd/dominowiki.nsf...133PMHPERN7.htm

    P.S.
    По поводу собирания SQL запроса в строку и передачи ее в функцию - лучше используй
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">PreparedStatement</div></div><div class="sp-body"><div class="sp-content">Для начала на русском:
    http://www.javaportal.ru/java/tutorial/tut...dstatement.html

    Затем "от создателя":
    http://docs.oracle.com/javase/tutorial/jdb...s/prepared.html

    И затем примеры на Java:
    http://www.roseindia.net/jdbc/jdbc-mysql/SelectRecords.shtml
    http://www.roseindia.net/jdbc/jdbc-mysql/T...Statement.shtml
     
  14. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Кирилл Шваб, lmike большое Вам спасибо, завтра попробую сделать все что вы написали.
    Жаль еще раз нельзя плюсануть)
     
  15. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    RixPvl
    Было бы интересно увидеть, как преобразился код в результате этих проб)
     
  16. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Как раз сейчас делаю используя новый метод, только вот столкнулся с одним моментом как сделать ее в виде "универсальной" функции что то типа

    Код (Text):
    function bool function SQL_EXEC(String SQL, params)
    {
    ...
    }
    объясню суть функции, а точнее покажу

    SQL_EXEC("INSERT INTO table(f1,f2,f3) VALUES(?,?,?)", p1, p2, p3)
    причем кол-во параметром может быть разным
     
  17. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Есть правда следующая идея написать функции что то типа

    Код (Text):
         public PreparedStatement SetPreparedStatementSQLExec_Use(String Query) {
    try {
    return (PreparedStatement) conn.prepareStatement(Query);
    } catch (SQLException e) {
    e.printStackTrace();
    return null;
    }
    }
    а потом написать функцию которая будет присваивать значения типа
    Код (Text):
    setLong(1, 123456789);
    и функция выполнения запроса, только получается муторно кажется)
     
  18. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    RixPvl
    Я выше что-то такое имел ввиду:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>/**
    * @param nd - документ, из которого будут вычисляться значения
    * @param vctRdbFields - вектор полей реляционной БД, полученный из конфугурационного документа
    * @param vctLdbFormulas - вектор формул для вычисления значений из документа, передаваемых в соответствующее поле РДБ вектора vctRdbFields,
    * полученный из конфугурационного документа; чаще всего просто имя item'а
    * @param vctValueTypes - вектор типов передаваемых значений, полученный из конфугурационного документа
    * Количество значений в векторах должно быть равным (контролируется в интерфейсе конфигурационного документа и/или методе инициализации векторов).
    * @return Запрос в виде строки, сгенерированный по переданному документу
    */
    public String generateDocumentRequest(Document nd, Vector vctRdbFields, Vector vctLdbFormulas, Vector vctValueTypes) {
    String sRequest;
    for (int i = 0; i < vctRdbFields.size(); i++) {
    // здесь производим вычисление значений и сборку текста запроса
    // вполне возможно использовать здесь PreparedStatement, но тогда, наверное, функция будет возвращать уже не String
    // для того, чтобы использовать vctValueTypes для вызова setXXX, наверное логично заюзать Reflection
    }
    return sRequest;
    }[/CODE]Кстати, вектора можно не передавать параметрами, а сделать их полями класса, т.к. метод будет вызываться в цикле, то меняться будет только сам документ.

    Добавлено:
    Про Java Reflection можно почитать здесь, а можно просто проставить switch и не заморачиваться. Но с Reflection красивше :)
     
  19. RixPvl

    RixPvl Well-Known Member

    Регистрация:
    30 ноя 2011
    Сообщения:
    85
    Симпатии:
    0
    Думаю к PreparedStatement я вернусь, смотрю на это все и думаю что надо хорошенько посидеть чтобы понять что к чему, и на сколько это быстрей чем то что я использую?

    сейчас я увеличил JavaMaxHeapSize до 256 мб и до скольки можно ее поднять? это зависит от озу?

    + сделал изменение при переборе клекции по аналогии из хелп лотуса
    <!--shcode--><pre><code class='java'>while (doc != null) {
    System.out.println
    ("\t" + doc.getItemValueString("Subject"));
    tmpdoc = view.getNextDocument(doc);
    doc.recycle();
    doc = tmpdoc;
    }[/CODE]
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Чуть измененный агент</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    import lotus.domino.*;
    import java.util.*;
    import java.io.PrintWriter;
    import java.text.*;

    public class MySQLExport extends AgentBase {
    jMySQL MySQL = new jMySQL();   
    String AgentName = "Export2SQL";
    String SQL = "";
    int NCount = 0;
    Database db = null;
    Document profile = null;
    PrintWriter PW = null;

    boolean SQLEXECR = false;

    /* Получить текущую дату */
    private String getDateTime(String format) {
    format = format.isEmpty()?"dd.MM.yyyy hh:mm:ss":format;
    DateFormat dateFormat = new SimpleDateFormat(format);
    Date date = new Date();
    return dateFormat.format(date);
    }

    /* метод для конверации даты в дату в формате UNIX */
    private long StrToDateUnix(String datatime, String format)
    {
    try
    {
    format = format.isEmpty()?"dd.MM.yyyy hh:mm:ss":format;
    DateFormat formatter = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss");
    Date date2 = formatter.parse(datatime);
    return (long)date2.getTime() / 1000L;
    } catch (Exception e) {
    return -1;
    }
    }

    /* Аналог функции Print в LS */
    private void Print(String Text){
    System.out.println(AgentName + ": " +Text);
    }

    private void ExportNotice(Database db) {
    Document doc = null;
    View view = null;
    Document ntTmp = null;

    try {
    try {
    Print("[OK] - Поиск уведомлений в модуле Шлюз...!");
    view = db.getView("noticesByUniqueNum");
    NCount = view.getEntryCount();
    Print("[OK] - Найдено уведомлений: " + NCount);
    if (NCount == 0)
    {
    Print("[W] - Не найдено ни одного докумета, завершение выполнение агента!");
    return;
    }
    /* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
    Print("[OK] - Очистка таблицы уведомлений в MySQL...!");
    SQL = "TRUNCATE TABLE `notice`";
    SQLEXECR = MySQL.SQLExec(SQL);
    Print("[OK] - Очистка завершена!");
    Print("[OK] - Начинаем выгрузку уведомлений в MySQL...");
    /* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
    doc = view.getFirstDocument();

    while (doc != null) {
    /* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
    String fnRegNum = doc.getItemValueString("fnRegNum");
    String fnSendet = doc.getItemValueString("fnSendet");
    long fnDataTime = StrToDateUnix( doc.getItemValueString("fnDataTime"), "");
    String fnDepID = !doc.getItemValueString("fnDepID").isEmpty()?doc.getItemValueString("fnDepID").trim():"0";
    String fnDepIDTo = !doc.getItemValueString("fnDepIDTo").isEmpty()?doc.getItemValueString("fnDepIDTo").trim():"0";
    String fnOrganization = doc.getItemValueString("fnOrganization");
    String fnAppName = doc.getItemValueString("fnAppName");
    String fnAppEmail = doc.getItemValueString("fnAppEmail");
    String fnAppMPhone = doc.getItemValueString("fnAppMPhone");
    String fnCategory = !doc.getItemValueString("fnCategory").isEmpty()?doc.getItemValueString("fnCategory").trim():"0";
    String fNStatIndex = !doc.getItemValueString("fNStatIndex").isEmpty()?doc.getItemValueString("fNStatIndex").trim():"0";
    String fNStatText = doc.getItemValueString("fNStatText");
    long fNStatExpire = StrToDateUnix( doc.getItemValueString("fNStatExpire") + " 00:00:00", "");
    String fnExName = doc.getItemValueString("fnExName");
    String fnExPost = doc.getItemValueString("fnExPost");
    String fnUniqNum = doc.getItemValueString("fnUniqNum");
    long fnCreateTime = StrToDateUnix( doc.getItemValueString("fnCreateTime"), "");

    /* Экранизация данных - предотвращает ошибки при отправки SQL запросов */
    fnRegNum = MySQL.real_escape_string(fnRegNum);
    fnOrganization = MySQL.real_escape_string(fnOrganization);
    fnAppName = MySQL.real_escape_string(fnAppName);
    fnAppEmail = MySQL.real_escape_string(fnAppEmail);
    fNStatText = MySQL.real_escape_string(fNStatText);
    fnExPost = MySQL.real_escape_string(fnExPost);
    fnExName = MySQL.real_escape_string(fnExName);
    fnUniqNum = MySQL.real_escape_string(fnUniqNum);


    /* Подготовка SQL Запроса */
    SQL = "INSERT INTO `notice` " +
    "(`fnRegNum`,`fnSendet`,`fnDataTime`,`" +
    "fnDepID`,`fnDepIDTo`,`fnOrganization`,`fnAppName`," +
    "`fnAppEmail`,`fnAppMPhone`,`fnCategory`,`fNStatIndex`," +
    "`fNStatText`,`fNStatExpire`,`fnExName`,`fnExPost`,`fnUniqNum`, `fnCreateTime`)";
    SQL += "VALUES(";
    SQL +=  "'"+fnRegNum.trim()+"','"+fnSendet.trim()+"','"+fnDataTime+"'," +
    "'"+fnDepID.trim()+"','"+fnDepIDTo.trim()+"','"+fnOrganization.trim()+"','"+fnAppName.trim()+"'," +
    "'"+fnAppEmail.trim()+"','"+fnAppMPhone.trim()+"','"+fnCategory.trim()+"','"+fNStatIndex.trim()+"'," +
    "'"+fNStatText.trim()+"','"+fNStatExpire+"','"+fnExName.trim()+"','"+fnExPost.trim()+"','"+fnUniqNum.trim()+"', '"+fnCreateTime+"')";

    /* Отправка запроса */
    /*Print(SQL); */
    SQLEXECR = MySQL.SQLExec(SQL);
    /* Получаем следующий документ */

    ntTmp = doc;
    doc = null;
    doc = view.getNextDocument(ntTmp);
    ntTmp.recycle();
    }
    Print("[OK] - Экспорт уведомлений завершен!");
    Print("------------------------------------------------------------------");
    } catch (Exception e) {
    Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
    e.printStackTrace();
    }
    } finally {
    doc = null;
    view = null;
    ntTmp = null;
    }

    }

    private void ExportDep(Database db) {
    Document doc = null;
    View view = null;
    Document ntTmp = null;

    try {
    try {
    Print("[OK] - Составление списка управлений из модуля Шлюз...!");
    view = db.getView("depByName");
    Print("[OK] - Найдено документов: " + view.getEntryCount());
    if (view.getEntryCount() == 0)
    {
    Print("[W] - Не найдено ни одного управления, завершение выполнение агента!");
    return;
    }
    /* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
    Print("[OK] - Очистка таблицы MySQL...!");
    SQL = "TRUNCATE TABLE `dep_list`";
    SQLEXECR = MySQL.SQLExec(SQL);
    Print("[OK] - Очистка завершена!");
    Print("[OK] - Начинаем выгрузку данных в MySQL...");
    /* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
    doc = view.getFirstDocument();

    while (doc != null) {
    /* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
    String dep_id = doc.getItemValueString("fDUnid");
    String dep_name = doc.getItemValueString("fDName");
    String dep_namekz = doc.getItemValueString("fDNameKZ");

    String dep_address = doc.getItemValueString("fDAddress");
    String dep_leader = doc.getItemValueString("fDLeader");
    String dep_leader_contact = doc.getItemValueString("fDLeader_ContactInfo");
    String dep_leader_email = doc.getItemValueString("fDLeader_ContactEmail");
    String dep_citizen = doc.getItemValueString("fDCitizen_FIO");
    String dep_citizen_contact = doc.getItemValueString("fDCitizen_ContactInfo");
    int dep_sort_id = (int) doc.getItemValueInteger("fDSortID");

    dep_sort_id = dep_sort_id <=0?300:dep_sort_id;


    /* Экранизация данных - предотвращает ошибки при отправки SQL запросов */
    dep_name = MySQL.real_escape_string(dep_name);
    dep_namekz = MySQL.real_escape_string(dep_namekz);
    dep_address = MySQL.real_escape_string(dep_address);
    dep_leader_contact = MySQL.real_escape_string(dep_leader_contact);
    dep_leader_email = MySQL.real_escape_string(dep_leader_email);
    dep_citizen_contact = MySQL.real_escape_string(dep_citizen_contact);


    /* Подготовка SQL Запроса */
    SQL = "INSERT INTO `dep_list` " +
    "(`dep_id`,`dep_name`,`dep_namekz`,`dep_address`,`" +
    "dep_leader`,`dep_leader_contact`,`dep_leader_email`,`dep_citizen`," +
    "`dep_citizen_contact`,`dep_sort_id`)";
    SQL += "VALUES(";
    SQL +=  "'"+dep_id+"','"+dep_name+"','"+dep_namekz+"','"+dep_address+"'," +
    "'"+dep_leader+"','"+dep_leader_contact+"','"+dep_leader_email+"','"+dep_citizen+"'," +
    "'"+dep_citizen_contact+"', '"+dep_sort_id+"')";

    /* Отправка запроса */
    SQLEXECR = MySQL.SQLExec(SQL);
    /* Получаем следующий документ */

    ntTmp = doc;
    doc = null;
    doc = view.getNextDocument(ntTmp);
    ntTmp.recycle();
    }

    MySQL.SQLExec(SQL);
    Print("[OK] - Запись в таблицу обновлений внесена!");
    Print("[OK] - Экспорт списка управлений завершен!");
    Print("------------------------------------------------------------------");
    } catch (Exception e) {
    Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
    e.printStackTrace();
    }
    } finally {
    doc = null;
    view = null;
    ntTmp = null;
    }

    }

    private void ExportStatus(Database db) {
    Document doc = null;
    View view = null;
    Document ntTmp = null;

    try {
    try {
    Print("[OK] - Составление списка статусов из модуля Шлюз...!");
    view = db.getView("vInf_Status");
    Print("[OK] - Найдено статусов: " + view.getEntryCount());
    if (view.getEntryCount() == 0)
    {
    Print("[W] - Не найдено ни одного статуса, завершение выполнение агента!");
    return;
    }
    /* Очищаем таблицу от старых записей, для загрузки более актуальной информации */
    Print("[OK] - Очистка таблицы MySQL...!");
    SQL = "TRUNCATE TABLE `status_list`";
    SQLEXECR = MySQL.SQLExec(SQL);
    Print("[OK] - Очистка завершена!");
    Print("[OK] - Начинаем выгрузку данных в MySQL...");
    /* Перебираем документы и выполняем запрос на добавлении их в MySQL базу */
    doc = view.getFirstDocument();

    while (doc != null) {
    /* Получение данных из текущего документа,а так же проверка некоторых обязательных полей */
    String status_id = doc.getItemValueString("fSUid");
    String status_name = doc.getItemValueString("fSNameRU");
    String status_namekz = doc.getItemValueString("fSNameKZ");


    /* Подготовка SQL Запроса */
    SQL = "INSERT INTO `status_list` " +
    "(`status_id`,`status_name`,`status_namekz`)";
    SQL += "VALUES(";
    SQL +=  "'"+status_id+"','"+status_name+"','"+status_namekz+"')";

    /* Отправка запроса */
    SQLEXECR = MySQL.SQLExec(SQL);
    /* Получаем следующий документ */
    ntTmp = doc;
    doc = null;
    doc = view.getNextDocument(ntTmp);
    ntTmp.recycle();
    }


    MySQL.SQLExec(SQL);
    Print("[OK] - Экспорт статусов завершен!");
    Print("------------------------------------------------------------------");
    } catch (Exception e) {
    Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
    e.printStackTrace();
    }
    } finally {
    doc = null;
    view = null;
    ntTmp = null;
    }


    }
    /* Основной инициируемый метод */
    public void NotesMain() {
    PW=getAgentOutput();
    /* Фиксируем время начало выполнения агента */
    long StartTime = System.currentTimeMillis() / 1000;
    Session session = getSession();

    try{

    try {
    /* Выполнение */
    Print("[!] - Инициализция агента синхронизации с MySQL сервером!" );

    db = session.getAgentContext().getCurrentDatabase();
    Print("[!] - Получение настроек агента!" );
    profile = db.getProfileDocument("fProfile", "");

    if (profile == null)
    {
    Print("[!] - Проверьте настройки в базе!" );
    return;
    }

    String Run = profile.getItemValueString("fPMysqlEnabled");
    String Login = profile.getItemValueString("fPMysqlLogin");
    String Password = profile.getItemValueString("fPMysqlPassword");
    String DBName = profile.getItemValueString("fPMysqlDataBaseName");
    String Host = profile.getItemValueString("fPMysqlHost");

    if (Run.isEmpty())
    {
    Print("[!] - Агент отключен. Проверьте настройки в базе!" );
    return;
    }

    boolean cnt = MySQL.Connect(Host, DBName, Login, Password);
    if (!cnt)
    {
    Print("[ER] - Не удалось соедениться с сервером MySQL. Продробности об ошибке смотрете в логах сервера!");
    return;
    }

    Print("[OK] - Платформа: " + System.getProperty("os.name"));
    Print("[OK] - Соединение с MySQL сервером прошло успешно!");

    /* Экспорт статусов */
    ExportStatus(db);
    /* Экспорт списка управлений */
    ExportDep(db);
    /* Экспорт формы уведомлений */
    ExportNotice(db);

    /* UNIX время завершения выполнения агента */
    long EndTime = System.currentTimeMillis() / 1000;


    long CurrentDate = StrToDateUnix(getDateTime("dd.MM.yyyy") + " 00:00:00", "");

    SQL = "INSERT INTO `notice_update` (`date_update`, `last_update`, `start_update`, `recordcount`) VALUES ('"+CurrentDate+"', '"+StartTime+"','"+EndTime+"','"+NCount+"')";
    MySQL.SQLExec(SQL);

    SQL = "INSERT INTO notice_logupdate (`day_id`,`start_time`, `end_time`, `recordcount`) VALUES ('"+CurrentDate+"', '"+StartTime+"', '"+EndTime+"', '"+NCount+"') " +
    "ON DUPLICATE KEY UPDATE start_time='"+StartTime+"', end_time='"+EndTime+"', recordcount='"+NCount+"'";

    MySQL.SQLExec(SQL);
    Print("[OK] - Синхронизация успешно завершена");
    PW.println("Content-type: text/plain; charser: utf-8");
    PW.println("OK");
    } catch (Exception e) {
    Print("[ER] - Текст ошибки: " + e.getMessage() + " Код ошибки: " + e.hashCode());
    e.printStackTrace();
    }

    }
    finally {
    PW = null; 
    MySQL = null;      
    profile = null;
    db = null;
    }



    }
    }
    вроде как заработало и выполнился агент до конца, но тут заметил одну вещь возможно ошибаюсь, то все же

    сегодня днем проверял состояние памяти на сервере было 50-60% занято, к концу дня занято было 96%, с чем это может быть связано? не нужно ли после выполнения всех агентов выполнять уничтожение всех созданных объектов?
     
  20. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Ну быстрее-то оно вряд ли будет (линейный код почти всегда быстрее), но удобней будет точно.

    Добавлено: дискуссия по правильной очистке объектов перенесена в профильную тему.
     
Загрузка...

Поделиться этой страницей