forum.bitel.ru http://forum.bitel.ru/ |
|
Получение и запись данных в Mysql http://forum.bitel.ru/viewtopic.php?f=19&t=10021 |
Страница 1 из 2 |
Автор: | Inspire [ 12 дек 2014, 18:44 ] |
Заголовок сообщения: | Получение и запись данных в Mysql |
Здравствуйте, версия биллинга 5.1. Как установить соединение с mysql, которая находится на удаленном сервере, в скрипте поведения? Стоит задача сделать автоматическую запись данных в mysql при создании договора. Пробовал сделать выборку данных так: Код: import java.sql.Connection; import bitel.billing.server.contract.bean.Contract; import bitel.billing.server.contract.bean.ContractManager; import bitel.billing.server.util.MailMsg; import ru.bitel.bgbilling.kernel.event.Event; import ru.bitel.bgbilling.kernel.event.events.ContractCreatedEvent; import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; import ru.bitel.bgbilling.server.util.Setup; public void onEvent( event, setup, con, conSlave ) { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; String DB_URL = "jdbc:mysql://172.16.0.15/redmine_default"; // Database credentials String USER = "root"; String PASS = "root"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(DB_URL,USER,PASS); Statement stmt = conn.createStatement(); String sql = "SELECT name FROM projects limit 1"; ResultSet rs = stmt.executeQuery(sql); rs.next(); String first = rs.getString("name"); print("First: " + first); rs.close(); stmt.close(); conn.close(); } В результате биллинг зависает при нажатии кнопки создать договор |
Автор: | skn [ 12 дек 2014, 19:09 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
добавте в скрипт логирование после каждой строки и посмотрите на чем зависает. |
Автор: | Amir [ 12 дек 2014, 20:13 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Подозреваю что на попытке подключения к удаленной БД. |
Автор: | vkulakov [ 12 дек 2014, 20:14 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Я подключался так: Код: try { String user = setup.get("xxx.db.user"); String pswd = setup.get("xxx.db.pswd"); String dbUrl = setup.get("xxx.db.url"); String dbDriver = setup.get("xx.db.driver"); DriverManager.registerDriver((Driver)Class.forName(dbDriver).newInstance()); neoConn = DriverManager.getConnection(dbUrl, user, pswd); } catch (Exception e) { log.error("Cannot connect to FTTx DB: " + e.getMessage()); e.printStackTrace(); return false; } Дальше neoConn можно использовать как обычный коннекшен. И, кстати, с сервера биллинга клиентом mysql можно к удалённой базе подключиться? |
Автор: | Inspire [ 15 дек 2014, 12:20 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Если делать моим способом, он ругается на то, что не может найти jdbc, так как я его и не подключал. В java это делается путем добавления jar и импорта библиотеки, а тут-то как быть? Тот же вопрос касательно библиотеки логов. Логирование сделал просто функцией print Код: String user = setup.get("xxx.db.user"); String pswd = setup.get("xxx.db.pswd"); String dbUrl = setup.get("xxx.db.url"); String dbDriver = setup.get("xx.db.driver"); За место xxx что надо подставить? vkulakov писал(а): И, кстати, с сервера биллинга клиентом mysql можно к удалённой базе подключиться? У меня биллинг находистся на одном адресе, а база данных редмайна на другом. |
Автор: | vkulakov [ 15 дек 2014, 12:33 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Inspire писал(а): За место xxx что надо подставить? Можете setup.get("xx.db.driver") на строки со своими значениями заменить. А вообще, если у вас биллинг работает, значит он подключился к базе и значит, что дополнительные библиотеки не нужны. В общем случае свои библиотеки нужно класть в BGBillingServer/lib/ext или app. Попробуйте в своём коде подключится к базе биллинга с теми параметрами, которые указаны в BGBillingServer/data/data.properties. Если всё заведётся, значит проблема с доступом к удалённой базе. (В моём предыдущем примере можете убрать "xxx." и код сразу подхватит эти параметры.) |
Автор: | Inspire [ 15 дек 2014, 13:47 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
vkulakov писал(а): Inspire писал(а): За место xxx что надо подставить? Можете setup.get("xx.db.driver") на строки со своими значениями заменить. А вообще, если у вас биллинг работает, значит он подключился к базе и значит, что дополнительные библиотеки не нужны. В общем случае свои библиотеки нужно класть в BGBillingServer/lib/ext или app. Попробуйте в своём коде подключится к базе биллинга с теми параметрами, которые указаны в BGBillingServer/data/data.properties. Если всё заведётся, значит проблема с доступом к удалённой базе. (В моём предыдущем примере можете убрать "xxx." и код сразу подхватит эти параметры.) Вариант 1: Подставил настройки базы биллинга, все заработало таким вариантом Код: try{ String DB_URL = "jdbc:mysql://адрес/bgbilling"; String USER = "user"; String PASS = "pass"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(DB_URL,USER,PASS); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM contract limit 1"; ResultSet rs = stmt.executeQuery(sql); rs.next(); String first = rs.getString("title"); print("First: " + first); rs.close(); stmt.close(); conn.close(); } catch(Exception e){ print(e.getMessage()); e.printStackTrace(); } Причем, когда подставил адрес другой базы, выдало ошибку : Communications link failure Last packet sent to the server was 0 ms ago. Вариант 2: Код: try{ String user = setup.get("db.user"); String pswd = setup.get("db.pswd"); String dbUrl = setup.get("db.url"); String dbDriver = setup.get("db.driver"); DriverManager.registerDriver((Driver)Class.forName(dbDriver).newInstance()); neoConn = DriverManager.getConnection(dbUrl, user, pswd); Statement stmt = neoConn.createStatement(); String sql = "SELECT * FROM contract limit 1"; ResultSet rs = stmt.executeQuery(sql); rs.next(); String first = rs.getString("title"); print("First: " + first); //STEP 6: Clean-up environment rs.close(); stmt.close(); conn.close(); } catch(Exception e){ print(e.getMessage()); e.printStackTrace(); } Выдает ошибку Typed variable declaration : Error in method invocation: Method get( java.lang.String ) not found in class'ru.bitel.bgbilling.server.util.Setup' : at Line: 21 : in file: Function [id:7; title:create_ticket_task] : setup .get ( "db.user" ). Причем пробовал и просто "user" и "db.user" и логин базы за место user подаставлять. Проблема в том, что база биллинга на одном сервере, а база редмайна, куда мне надо подконектиться, на другом =/ Есть ли какой-то выход из этой ситуации? |
Автор: | vkulakov [ 15 дек 2014, 14:00 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Забейте на мой вариант. Если к базе биллинга коннектится, а к вашей нет, то проблема именно с доступом к другой базе. Делайте ping, пробуйте использовать mysql-клиент на сервере биллинга... Тут-то элементарно всё должно быть. |
Автор: | Inspire [ 15 дек 2014, 16:27 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
В общем из биллинга можно подконектиться к другой базе. Просто пинга не было. Ток вот выводит пока вопросы вместо русских букв, а так работает. Причем в нет бинсе нормально выводится. Может, дело в настройках биллинга? |
Автор: | stark [ 15 дек 2014, 18:05 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Inspire писал(а): В общем из биллинга можно подконектиться к другой базе. Просто пинга не было. Ток вот выводит пока вопросы вместо русских букв, а так работает. Причем в нет бинсе нормально выводится. Может, дело в настройках биллинга? какая кодировка в базе? какая в таблицах где хранятся нужные данные ? какая в db.url ? |
Автор: | Inspire [ 15 дек 2014, 18:31 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
show create database redmine - utf8 show create table news - utf8 show variables like "char%": character_set_client | koi8r | | character_set_connection | koi8r | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | koi8r | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/local/share/mysql/charsets/ show variables like "coll%": collation_connection | koi8r_general_ci | | collation_database | utf8_general_ci | | collation_server | latin1_swedish_ci Лично на мой взгляд, тут полная ж..па. Редмайн работает давно, настраивал не я. Если менять кодировку, то и он может полететь. Просто меня обнадеживает тот факт, что в нетбинсе отображаются русские буквы. |
Автор: | stark [ 15 дек 2014, 18:53 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Inspire писал(а): show create database redmine - utf8 show create table news - utf8 show variables like "char%": character_set_client | koi8r | | character_set_connection | koi8r | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | koi8r | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/local/share/mysql/charsets/ show variables like "coll%": collation_connection | koi8r_general_ci | | collation_database | utf8_general_ci | | collation_server | latin1_swedish_ci Лично на мой взгляд, тут полная ж..па. Редмайн работает давно, настраивал не я. Если менять кодировку, то и он может полететь. Просто меня обнадеживает тот факт, что в нетбинсе отображаются русские буквы. нормально там все.. utf8..вы у себя в url(тот, который к этой базе) проставьте Код: characterEncoding=utf8 и возможно нормально заработает.
|
Автор: | Inspire [ 15 дек 2014, 19:24 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Уже пробовал так Код: jdbc:mysql://адрес/redmine?characterEncoding=utf8 . Все равно выводит ????.То что там кодировка соединения и тд koi8r - нормально? И Код: String query = "set names utf8"; stmt.execute(query); query = "set character set utf8"; stmt.execute(query); Тоже не помогает. И cp1251 пробовал. |
Автор: | vkulakov [ 15 дек 2014, 19:40 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Inspire писал(а): Уже пробовал так Код: jdbc:mysql://адрес/redmine?characterEncoding=utf8 . Все равно выводит ????.Глупый вопрос: а вы после установки кодировки в урле запись в редмайне новую создаёте или всё старую смотрите? |
Автор: | Inspire [ 15 дек 2014, 19:48 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
vkulakov писал(а): Inspire писал(а): Уже пробовал так Код: jdbc:mysql://адрес/redmine?characterEncoding=utf8 . Все равно выводит ????.Глупый вопрос: а вы после установки кодировки в урле запись в редмайне новую создаёте или всё старую смотрите? А если мне надо старую вывести? |
Автор: | stark [ 15 дек 2014, 20:10 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Inspire писал(а): Уже пробовал так Код: jdbc:mysql://адрес/redmine?characterEncoding=utf8 . Все равно выводит ????.То что там кодировка соединения и тд koi8r - нормально? сложно сказать ..это же кодировка соединения вашего клиента консольного . В общем случае бывает что данные в базе к одной кодировке, а пишут туда реально в другой кодировке. И нужно делать двойное перекодирование чтобы оттуда что-то вытащить .. Это надо на месте разбираться, перебирать, пробовать. |
Автор: | Inspire [ 16 дек 2014, 13:23 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Хоть кодировка таблиц и бд в utf8 с сопоставлением utf8_general_ci, но stark писал(а): Inspire писал(а): | character_set_server | latin1 кодировка сервера latin1. Мне кажется дело в этом. Может, он ее в латин кодирует а потом в utf8. |
Автор: | stark [ 16 дек 2014, 13:32 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Inspire писал(а): Хоть кодировка таблиц и бд в utf8 с сопоставлением utf8_general_ci, но stark писал(а): Inspire писал(а): | character_set_server | latin1 кодировка сервера latin1. Мне кажется дело в этом. Может, он ее в латин кодирует а потом в utf8. кодировка сервера это всего лишь дефолтная кодировка, в которой новые базы создаются. Кодировка базы более приоритетная, она используется для того чтобы задавать кодировки новых создаваемых таблиц. А кодировка таблицы это уже самая главная кодировка, которая и определяет какие там данные там хранятся. Но бывает что реально там хранятся данные не в той кодировке..Тут надо смотреть настройки того, кто туда пишет и читает - у него там может стоять левая кодировка и он может реально данные перекодировать по своему. У нас такое бывало когда конвертировали базу netup, иногда ее криво изначально настраивали и там было двойное перекодирование, netup работал, а чтобы достать оттуда приходилось немного помучаться с подбором что там на само деле, реально данные были не в той кодировке, которая была заявлена в таблице. |
Автор: | Inspire [ 16 дек 2014, 15:28 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Если делать запись в базу из скрипта поведения, то она записывается нормально, т.е. русские букы. А при выводе на консоль биллинга выводятся вопросы. С кодировкой базы все ок. Есть где-нибудь возможность поменять кодировку консоли вывода биллинга? Это не помогло: # Кодировка файлов динамического кода (UTF-8 предпочтительно, по умолчанию) dynamic.src.encoding=UTF-8 # Каталог размещения динамического кода относительно BGBillingServer dynamic.src.dir=dyn |
Автор: | dimOn [ 16 дек 2014, 16:15 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
это точно ни при чём. в общем, вопрос требует отдельного усиленного изучения, возможно с доступом итд. |
Автор: | vkulakov [ 16 дек 2014, 18:26 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Inspire писал(а): vkulakov писал(а): Inspire писал(а): Уже пробовал так Код: jdbc:mysql://адрес/redmine?characterEncoding=utf8 . Все равно выводит ????.Глупый вопрос: а вы после установки кодировки в урле запись в редмайне новую создаёте или всё старую смотрите? А если мне надо старую вывести? Что-то я не понял, к чему пришли. Сейчас нормально всё отображается и проблема только в выводе на консоль? Чем заходите на сервер биллинга? Если PuTTY, то там нужно указать правильный Translation и выбрать подходящий шрифт. |
Автор: | stark [ 16 дек 2014, 18:31 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Inspire писал(а): Если делать запись в базу из скрипта поведения, то она записывается нормально, т.е. русские букы. А при выводе на консоль биллинга выводятся вопросы. С кодировкой базы все ок. Есть где-нибудь возможность поменять кодировку консоли вывода биллинга? Это не помогло: # Кодировка файлов динамического кода (UTF-8 предпочтительно, по умолчанию) dynamic.src.encoding=UTF-8 # Каталог размещения динамического кода относительно BGBillingServer dynamic.src.dir=dyn у вас консоль в какой системе? какая там кодировка ? utf8 ? ну поставьте -Dfile.encoding=UTF-8 в параметрах запуска сервера биллинга. |
Автор: | Inspire [ 16 дек 2014, 18:42 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Выводятся данные в клиенте биллинга. Захожу на сервер через клиент биллинга с помощью такого скрипта: Код: @echo off set BGBILLING_DIR=. set CLASSPATH=%BGBILLING_DIR%;%BGBILLING_DIR%\lib\* if not exist %BGBILLING_DIR%\lib.update goto m0 copy %BGBILLING_DIR%\lib.update\* %BGBILLING_DIR%\lib rmdir /q /s %BGBILLING_DIR%\lib.update :m0 start c:\Java\jre6\bin\javaw -Dupdate.folder=lib.update -Djavax.net.ssl.trustStore=.keystore -Dsun.net.client.defaultConnectTimeout=1000 -Xmx256m -Duser.language=ru -Duser.region=RU -cp %CLASSPATH% bitel.billing.ShellFrame Вставлял -Dfile.encoding=UTF-8 так Код: start c:\Java\jre6\bin\javaw -Dupdate.folder=lib.update -Djavax.net.ssl.trustStore=.keystore -Dsun.net.client.defaultConnectTimeout=1000 -Xmx256m -Duser.language=ru -Dfile.encoding=UTF-8 -Duser.region=RU -cp %CLASSPATH% bitel.billing.ShellFrame Не помогло. Кстати, бд и таблицы на биллинге в кодировке cp1251. Пробовал -Dfile.encoding=cp1251 и -Dfile.encoding=windows-1251. Тоже не помогло. |
Автор: | dimOn [ 16 дек 2014, 18:48 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Присоединяюсь к ничего не понявшим выше. За 24 сообщения понятнее не становится проблема. Где "в клиенте выводятся данные"? Что такое "консоль вывода биллинга"? Что не работает то? Как что и где вы "смотрите в нетбинсе" и там всё нормально - это самое непонятное. В какой момент кодировка портится то? |
Автор: | Inspire [ 16 дек 2014, 18:51 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
В клиенте в логах скрипта выводятся данные. При записи данных через скрипт поведения в базу данных все ок, русские текст отображается нормально в базе данных. При выводе данных из базы командой Print в логах скрипта поведения вопросы за место русского текста. В ide netbeans через функцию system.out.println(rs.getString("title") вывожу русский текст на экран. Там выводится правильно. А в биллинге вот-с как: |
Автор: | stark [ 16 дек 2014, 19:09 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
не понял, так проблема уже не с другой базой данных, а с нашей , где вывод скрипта хранится ? |
Автор: | Inspire [ 16 дек 2014, 19:26 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
stark писал(а): не понял, так проблема уже не с другой базой данных, а с нашей , где вывод скрипта хранится ? База данных, откуда я вывожу данные, все та же - бд редмайна, которая находится на другом сервере. Там кодировка бд, таблиц, полей utf8. Скрипт поведения писал в биллинге в разделе сервис -> автоматизация -> фукнции скриптов поведения. Код скрипта поведения: Код: public void onEvent( event, setup, con, conSlave )
{ try{ String DB_URL = "jdbc:mysql://адрес редмайна/redmine?characterEncoding=utf8"; String USER = "user"; String PASS = "pass"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); Statement stmt = conn.createStatement(); String sql = "select * from news"; ResultSet rs = stmt.executeQuery(sql); rs.next(); String first = rs.getString("title"); print("First: " + first); rs.close(); stmt.close(); conn.close(); } catch(Exception e){ print(e.getMessage()); e.printStackTrace(); } |
Автор: | stark [ 16 дек 2014, 19:48 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
А если написать Код: print("привет" ); нормально выводит? |
Автор: | Inspire [ 16 дек 2014, 19:57 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
stark писал(а): А если написать Код: print("привет" ); нормально выводит? Нет, знаки вопроса |
Автор: | stark [ 16 дек 2014, 20:14 ] |
Заголовок сообщения: | Re: Получение и запись данных в Mysql |
Inspire писал(а): stark писал(а): А если написать Код: print("привет" ); нормально выводит? Нет, знаки вопроса так что же вы нас запутываете своими внешними базами..Причем тут они ? |
Страница 1 из 2 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |