NHibernate с проблемой производительности вставки SQLite - PullRequest
0 голосов
/ 17 декабря 2010

Я использую NHibernate 3 с SQLite 3 (точнее - SQLCipher, но в данном случае это не имеет смысла).

Я настроил NHibernate следующим образом:

<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    <session-factory>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">Test.NHibernate.MySqliteDriver, nhibernate_test</property>     
        <property name="connection.connection_string">Data Source=embedded</property>
        <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
        <property name="query.substitutions">true=1;false=0</property>  
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu, Version=3.0.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4</property>
        <property name="show_sql">true</property>
    </session-factory>
</hibernate-configuration>

Здесь Test.NHibernate.MySqliteDriver, nhibernate_test - это пользовательский драйвер, который может обрабатывать строку подключения, например Data Source=embedded.Он не выполняет никаких конкретных операций, кроме создания SQLiteConnection в памяти DataSource и присоединения к нему одной базы данных с помощью инструкции ATTACH.Это тоже не имеет смысла.

У меня есть таблица:

public class Product
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Category { get; set; }
    public virtual bool Discontinued { get; set; }
}

Отображено на:

CREATE TABLE Prosucts (
    Id INTEGER PRIMARY KEY,
    Name VARCHAR(250),
    Category VARCHAR(250),
    Discontinued INTEGER
);

С отображением:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                   assembly="nhibernate_test" 
                   namespace="Test.NHibernate.Domain">
    <class name="Product" table="Products">
        <id name="Id">
            <generator class="native" />
        </id>
        <property name="Name" />
            <property name="Category" />
            <property name="Discontinued" />
    </class>
</hibernate-mapping>

В коде я делаю следующее:

var configuration = new Configuration();
configuration.Configure(typeof(Program).Assembly, "hibernate.cfg.xml");         
configuration.AddAssembly(typeof(Program).Assembly);

var sessionFactory = configuration.BuildSessionFactory();

var product = new Product
{
    Name = "Product",
    Category = "Products",
    Discontinued = true
};

var product2 = new Product
{
    Name = "Product 12",
    Category = "Bad products",
    Discontinued = true
};

using (var session = sessionFactory.OpenSession())
{               
    using(var transaction = session.BeginTransaction())
    {
        var sw = new Stopwatch();
        sw.Start();         

        session.Save(product);
        Console.WriteLine("saved 1st in {0}", sw.Elapsed);
        sw.Reset();
        sw.Start();

        session.Save(product2);
        Console.WriteLine("saved 2nd in {0}", sw.Elapsed);
        sw.Stop();

        transaction.Commit();
    }
}

И получаю неутешительный вывод:

NHibernate: INSERT INTO Продукты (Имя, Категория, Снят с производства) ЗНАЧЕНИЯ (@ p0, @ p1@ p2);выберите last_insert_rowid ();@ p0 = 'Product' [Тип: String (0)], @ p1 = 'Products' [Тип: String (0)], @ p2 = True [Тип: Boolean (0)]

сохранено 1-е в 00: 00: 01.3444869

NHibernate: INSERT INTO Продукты (Имя, Категория, Снято с производства) ЗНАЧЕНИЯ (@ p0, @ p1, @ p2);выберите last_insert_rowid ();@ p0 = 'Product' [Тип: String (0)], @ p1 = 'Products' [Тип: String (0)], @ p2 = True [Тип: Boolean (0)]

сохранено 2-е в 00: 00: 00.0044215

Так почему вставка 1-й записи занимает так много времени ???(на 1,3 секунды)

1 Ответ

2 голосов
/ 17 декабря 2010

Я вижу два возможных источника:

  1. инициализация кеша (ов) сеанса, когда вы даете ему первую отслеживаемую сущность, и
  2. SQLite запускает свои внутренние компоненты для генерации этого первого собственного значения идентификатора
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...