Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Connection with MySQL 
V
    Опции темы
NewProgr
Дата 6.9.2006, 04:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Подскажите, пожалуйста, кому не сложно самый простой способ создания Connection с базой MySql
(чем подробнее, тем лучше) для сервера Tomcat 4.1

пусть:
   база MySQL: javatest
   user : Test
   password : test

Заранее благодарен
PM MAIL   Вверх
Alexandr87
Дата 6.9.2006, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 6
Всего: 39



я предпочитаю использовать источники данных, получаемых по jndi.
http://tomcat.apache.org/tomcat-4.1-doc/jn...ples-howto.html

но можно использовать jdbc напрямую
http://www.developer.com/java/data/article.php/3417381

Это сообщение отредактировал(а) Alexandr87 - 6.9.2006, 06:48
PM Jabber   Вверх
Gliven
Дата 6.9.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.9.2006

Репутация: нет
Всего: нет



Вот еще способ конекшена через JDBC: 
Код

public java.sql.Connection getConnection() throws SQLException
    {
        String user = null;
        String password = null;
        String url = null;
        String drivers = null;
        boolean useUnicode = true;
        String characterEncoding = null;
        //Описываешь чтение конф. файла

        Properties props = new Properties();
        try
        {
            FileInputStream in = new FileInputStream("config.properties");
            props.load(in);
            in.close();
            drivers = props.getProperty("jdbc.drivers");
            if (drivers != null)
                System.setProperty("jdbc.drivers", drivers);
            url = props.getProperty("jdbc.url");
            user = props.getProperty("jdbc.username");
            password = props.getProperty("jdbc.password");
            //useUnicode = props.getProperty("jdbc.useUnicode");
            characterEncoding = props.getProperty("jsbc.characterEncoding");
        }
        catch (IOException e)
        {
            System.out.println("Using default values");
        }
        user = (user==null)?"root":user;
        password = (password==null)?"root":password;
        url = (url==null)?"jdbc:mysql://OPSUR1:3306/testrun":url;
        drivers = (drivers==null)?"com.mysql.jdbc.Driver":drivers;
        characterEncoding = (characterEncoding==null)?"KOI8_R":characterEncoding;

        try
        {
            Class.forName(drivers);
        }
        catch(Exception e)
        {
            System.out.println("Driver not found");
        }
        return DriverManager.getConnection(url, user, password);
    }

    public void addTopic(String topic)
    {
        try
        {
//            Statement statement = getConnection().createStatement();
            String str;
//            str = "insert into topic values (null,'"+topic+"')";
//            statement.executeUpdate(str);
//      str = "insert into topic (topic) values ('"+topic+"')";
            str = "insert into topic (topic) values (?)";
            PreparedStatement statement = getConnection().prepareStatement(str);
            statement.setString(1,topic);
            statement.executeUpdate();
            
            
//            statement.prepareStatement(str);
//            statement.setString(1, topic);
//            statement.executeUpdate();
        }
        catch (Exception e)
        {
            System.out.println("" + e);
        }
    }

    public List<TopicBrief> getTopics()
    {
        List<TopicBrief> result = new ArrayList<TopicBrief>();
        try
        {
            Statement statement = getConnection().createStatement();
            String str = "select * from topic";
            ResultSet rs = statement.executeQuery(str);
            while (rs.next())
            {
                TopicBrief topic = new TopicBrief();
                topic.setId(rs.getInt(1));
                topic.setName(rs.getString(2));
                result.add(topic);
            }
            rs.close();
            statement.close();
        }
        catch (Exception e)
        {
            System.out.println("" + e);
        }
        return result;
    }


Или через hibernate:
Код

import org.hibernate.*;
import org.hibernate.cfg.AnnotationConfiguration;
import ru.customs.novoros.common.exceptions.AllException;

public class HibernateUtil {
    private static SessionFactory sessionFactory;

    public static final ThreadLocal<Session> session = new ThreadLocal<Session>();

    private HibernateUtil() {
    }

    public static Session currentSession() throws AllException {
        Session s = session.get();
        if (null == s) {
            s = getSessionFactory().openSession();
            session.set(s);
        }
        return s;
    }

    public static void closeSession() throws AllException {
        final Session s = session.get();
        session.set(null);
        if (null != s) {
            try {
                s.close();
            } catch (HibernateException e) {
                throw new AllException("Cannot close Hibernate session", e);
            }
        }
    }

    private static SessionFactory getSessionFactory() throws AllException {
        if (null == sessionFactory) {
            synchronized (HibernateUtil.class) {
                if (null == sessionFactory) {
                    try {
                        sessionFactory = new AnnotationConfiguration()
                                .configure().buildSessionFactory();
                    } catch (HibernateException e) {
                        throw new AllException(
                                "Cannot initialize Hibernate subsystem", e);
                    }
                }
            }
        }
        return sessionFactory;
    }

}


Добавлено @ 20:55 
Да, забыл сказать, прописи пароля, базы описываешь в hibernate.cfg.xml:
Код

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory name="defaultFactory">
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/tara</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.useUnicode">true</property>
        <property name="hibernate.connection.charSet">koi8-r</property>        
        <property name="hibernate.connection.characterEncoding">koi8-r</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <property name="hibernate.hbm2ddl.auto">update</property>

        <property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <mapping class="***"/>
        

    </session-factory>
</hibernate-configuration>

Данный xml описан под работу с MySQL.
PM MAIL   Вверх
tux
Дата 7.9.2006, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Gliven, настройки соединения с MySQL в Tomcat ведь попросили, а не как настроить Hibernate.
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 7.9.2006, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(tux @  7.9.2006,  04:34 Найти цитируемый пост)
Gliven, настройки соединения с MySQL в Tomcat ведь попросили, а не как настроить Hibernate.

Ну томкат, не томкат, что-то не видел особых различий и при использовании Hibernate или JDBC, что в томкате или вне его. А так вот JDBC, чуть попроще чем Hibernate, более стандартный.

Вот тебе класс с коннектом и дестроем smile 
Код

public class Connect {

    public Connection init() {
        String databaseurl = "jdbc:mysql://<хост>:<порт>/javatest?lc_ctype=KOI8-R",
                      user = "Test",
                  password = "test",
                driverName = "com.mysql.jdbc.Driver";
        Connection con = null;
        try {
            Class.forName(driverName).newInstance();
            con = DriverManager.getConnection(databaseurl, user, password);
        } catch (InstantiationException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (IllegalAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (SQLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        return con;
    }


    public void destroy (Connection con) {
        try {
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}


P.S. Вроде бы все верно(сократил свой класс, он у меня побольше и помуторнее, оставив только минимум необходимого smile )


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
tux
Дата 7.9.2006, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Bulat, одно замечание насчет использования твоего кода в production. Если у тебя этот класс используется в толстом клиенте (например, Swing-приложение), то его применение вполне оправдано. Один пользователь - одно соединение, которое поддерживается в открытом состоянии на все время работы приложения.

Если это веб-приложение, то здесь все несколько сложнее. В принципе можно использовать ту же самую схему - подключается новый пользователь, открывается соединение и использует постоянно на протяжении сеанса. Но веб-приложения традиционно обслуживают большее число пользователей чем разработанные по схеме толстый клиент. Да и в том случае если подразумевается, что со Swing-приложением будет работать очень большое количество пользователей такая схема не применяется. Причина проста: каждое соединение - это область памяти на сервере, может быть и не очень большая, но когда их много, это становится проблемой. Кроме того, поток запросов от пользователей, как правило, не очень интенсивен. Получается, что подавляющую часть времени это огромное число соединений не используется. А это, сам понимаешь, не эффективно. Кроме того, таким образом можно легко превысить максимальное количество соединений, которые СУБД может открыть.

Как же бороться с этой неэффективностью? А проблема решается достаточно просто. Во всех реальных больших веб-системах, работающих с базами данных используются пулы соединений. Создается массив соединений, ограниченный по количеству снизу и сверху (то есть минимальное количество соединений, которые открыты всегда и максимальное, больше которого открыть не разрешается чтобы не превысить ограничения СУБД). При попытке получить пользователем новое соединение менеджер пула соединений сначала смотрит а нет ли среди открытых соединений свободных, которые могут быть использованы. Если есть, то возвращает одно из них. Если нет, то проверяет не превышено ли доступное количество открытых соединений. Если нет, то открывает новое и возвращает клиенту. Если превышено, то запрос на соединение просто блокируется до тех пор пока хотя бы одно из соединений не освободится. При закрытии соединения клиентом соединение не закрывается реально, а помещается в массив свободных соединений.

Что получаем в результате:
  • соединений мало, используются они эффективно, ресурсов на сервере расходуется меньше
  • операции открытия и закрытия соединений в некоторых СУБД ресурсоемки по времени, в результате увеличивается быстродействие
Так что если твой класс используется в production, советовал бы внимательнее присмотреться к пулам соединений. Можно использовать то, что предоставляет Tomcat (посмотри по ссылкам, которые дал Alexandr87). Tomcat в качестве пула соединений использует библиотеку Commons-DBCP. А можно использовать и любую библиотеку помимо Tomcat. Еще бы рекомендовал посмотреть на C3P0 и Proxool.

Кстати, Hibernate даже в дефолтной кофигурации все-таки использует пул соединений, правда свой собственный и совсем простенький. И они рекомендуют использовать Hibernate на реальной нагрузке только в комбинации с какой-нибудь серьезной библиотекой, обеспечивающей организацию пула.
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 7.9.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(tux @  7.9.2006,  08:37 Найти цитируемый пост)
Если это веб-приложение, то здесь все несколько сложнее. В принципе можно использовать ту же самую схему - подключается новый пользователь, открывается соединение и использует постоянно на протяжении сеанса.

А зачем только тоскать соединение на протяжении сеанса? Если у меня пользователь пассивно весит, т.е. в браузере открыта страница, так и может висеть весь день а то и больше? Если ему что-то надо приконнектился, вывел необходимые данные на страницу, закрыл коннект.


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
tux
Дата 7.9.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Bulat @  7.9.2006,  16:30 Найти цитируемый пост)
Если ему что-то надо приконнектился, вывел необходимые данные на страницу, закрыл коннект. 

Тогда длительность подключения может в конечном счете сказать на производительности. Согласен, в MySQL создание соединения проходит достаточно быстро и на приложении с небольшим числом клиентов ощутимой разницы не будет. Но в многих СУБД процесс подключения хорошо заметен даже на глаз. Кроме того, еще одно достоинство пула - можно контролировать количество одновременно открытых соединений в то время как в твоей конструкции при превышении лимита СУБД во время пиковых нагрузок просто будет отказывать в подключении.
PM MAIL Skype GTalk Jabber YIM   Вверх
Bulat
Дата 7.9.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(tux @  7.9.2006,  11:39 Найти цитируемый пост)
Тогда длительность подключения может в конечном счете сказать на производительности. Согласен, в MySQL создание соединения проходит достаточно быстро и на приложении с небольшим числом клиентов ощутимой разницы не будет. Но в многих СУБД процесс подключения хорошо заметен даже на глаз. Кроме того, еще одно достоинство пула - можно контролировать количество одновременно открытых соединений в то время как в твоей конструкции при превышении лимита СУБД во время пиковых нагрузок просто будет отказывать в подключении. 

Это уже другой вопрос, и тут я с тобой полностью согласен smile 
Надо всегда смотреть по обстоятельствам


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
NewProgr
Дата 8.9.2006, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Народ, огромное спасибо за участие.
Сделал на JNDI.

А как на JSP странице писать русскими буквами при настройке :
Код

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

т.е. чтобы русский текст в html тегах отображался корректно?
PM MAIL   Вверх
tux
Дата 8.9.2006, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132




M
tux
NewProgr, почитай правила форума. Для каждого вопроса - новая тема.

PM MAIL Skype GTalk Jabber YIM   Вверх
NewProgr
Дата 8.9.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 19.5.2006

Репутация: нет
Всего: нет



Виноват, извиняюсь smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0884 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.