Категорія: ORM

 

Новини CF-OpenSource v15

Оновлення продуктів та додатків

SeleniumMX - A Selenium + MxUnit Framework

Вельми перспективний проект, що об'єднує в собі два фреймворки для тестування.

Mach-II 1.9

Допоміжний випуск фреймворку, що слідує за нещодавним 1.8.

cfUniForm v.4.0 - Leaner, Meaner, More Features - Just Plain Ol' Better

Нова версія фреймворку для побудови форм.

ColdMVC Available on GitHub

Новий convention-based фреймворк для CF9, що використовує можливості Hibernate.

Flash Inspector

Компонента для обчислення розмірів flash-роліку.

twitPic API 1.1

Компонента для взаємодії з API сервісу для розміщення малюнків.

ValidateThis CFWheels Plugin 0.5

ValidateThis 0.92

Додаток до CFWheels, що дозволяє використовувати на сайті ValidateThis, фреймворк для валідації форм.

Rhea: Rackspace Cloud API 0.99

Втілення взаємодії з API хостингу Rackspace Cloud.

ScriptWriter 3.0.0.0_alpha6

Модуль, що дозволяє програмно керувати включенням JavaScript та CSS до сторінок сайту, в тому числі з мінімізацією.

bit.ly URL Service API CFC 1.0

Втілення взаємодії з API Bit.ly, сервісу скорочення посилань.

Hermes Events 1.0

Втілення взаємодії з API Eventbrite, сервісу для організації подій.

ColdFusion File Manager 1.0 alpha 3

Файловий менеджер з GUI на Ajax.

BlogCFC 5.9.5.005

Оголошення про випуск оновлення популярного блогу.

 

Різні оновлення та повідомлення

Code coverage & cyclomatic complexity calculations coming to ColdFusion

Обговорення системи для тестування Chimera.

Framework One Sample Application - QBall

Приклад розробки на FW/1 від Рея Кемдена.

Do you want to see this in LightWire?

Пітер Белл запитує про доцільність додавання деяких нових можливостей до LightWire.

Day one with FW/1

Ще один опис першого досвіду роботи з FW/1.

MangoBlog/Oracle Integration

Опис досвіду розгортання Mango з Oracle в якості СУБД.

Content Management and the Splash CMS — Introduction

Огляд Splash CMS, побудованої на базі CFWheels.

Автор: Сергій Галашин | Опубліковано: 16.03.2010 о 11:28 | Категорії: CFWheels - ColdFusion 9 - Frameworks - FW/1 - Links - News - OpenSource - ORM - RIAForge -

 

Чат з Марком Менделом в Java DZone

Не так давно до DZone завітав Бен Форта, тепер це зробила й людина, про котру ми доволі часто згадуємо. Це Марк Мендел, розробник JavaLoader та Transfer ORM.

Як заведено, Марк спочатку розповідає деякі загальні речі про себе, зв'язок Java та ColdFusion та ORM, потім бесіда переходить до обговорення принад інтеграції, використання ORM з ACF9 чи Transfer, та короткого пояснення можливостей JavaLoader.

Про все це докладніше в Tech Chat: Mark Mandel on ColdFusion and Java Integration

Автор: Сергій Галашин | Опубліковано: 25.12.2009 о 07:33 | Категорії: ColdFusion 9 - Interview - Java - ORM - Transfer -

 

Новий розширюваний кеш у Transfer ORM 2.1

Наближається час випуску нової версії Transfer, і потроху з'являються відомості про головні покращення в ній.

Зокрема, Марк Мендел розповів про нову систему кешування, що прийде на зміну доволі простій нинішній версії. Причинами зміни називаються низька гнучкість поточної реалізації та рідкісні випадки витоків пам'яті, що змусило задуматися над використанням перевірених рішень.

Головною особливістю її буде розширюваність: можливість інтеграції з іншими існуючими рішеннями. Це доволі логічний крок, після аналогічних нововведень в основних серверах застосунків: ACF та Railo.

За умовчанням будуть підтримуватися EHCache та ColdBox Cache. Надалі планується підтримка й інших систем кешування.

Марк зауважив, що напевне будуть потрібні деякі зміни в конфігурації сайтів, що вже використовують кешування з Transfer. Зокрема, він навів декілька прикладів конфігурування.

<objectCache>
    <defaultcache provider="transfer.com.cache.provider.EHCacheProvider">
       <setting name="config" value="/test/resources/ehcache.xml"/>
    </defaultcache>
    <cache class="none.Basic" provider="transfer.com.cache.provider.NoCacheProvider"/>
    <cache class="none.Child" provider="transfer.com.cache.provider.NoCacheProvider"/>
</objectCache>

З прикладу очевидно, що використовується EHCache провайдер з окремим файлом конфігурації та виключаються з кешу два визначення (definitions): none.Basic та none.Child.

В свою чергу наводиться приклад ehCache.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

    <defaultCache
        maxElementsInMemory="1000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="600"
        overflowToDisk="false"
        />
   
    <cache name="AutoGenerate"
            eternal="false"
            maxElementsInMemory="10" overflowToDisk="false">
    </cache>
   
</ehcache>

Тут визначається налаштування кешу за умовчанням, де максимальна кількість елементів в пам'яті 1000 та час знаходження елементів в пам'яті 120 секунд для бездіяльних елементів і 600 секунд для активних.

Також визначаються окремі налаштування для класу AutoGenerate, що обмежує кількість елементів до 10.

По інші можливості налаштування EHCache можна дізнатися в документації.

 

Для тих, хто зацікавлений в написанні власних провайдерів, потрібно буде працювати з наслідуванням AbstractBaseProvider.cfc та відповідною реалізацією віртуальних та абстрактних методів звідти.

 

Також треба зауважити про інше важливе нововведення: появу методу shutdown(). Він використовується для коректного завершення роботи запиту, що дозволяє системі кешування провести очистку сміття, позачиняти тимчасові файлі та провести інші процедури, необхідні для стабільної та ефективної роботи.

Марк рекомендує виконувати цей метод в момент спрацьовування onApplicationEnd:

<cffunction name="onApplicationEnd" returnType="void">
   <cfargument name="applicationScope" required=true/>
<cfscript>
    arguments.applicationScope.transferFactory.shutdown();
</cfscript>
</cffunction>

Особливо важливим є цей метод при використанні EHCache, бо без нього системний потік і надалі буде виконуватися, не даючи провести очистку сміття.

 

Насамкінець, для контролю за кешуванням рекомендується використовувати компоненту Cache Monitor та її методи getDefaultCache() та getCache(className).

 

Вже зараз можна витягти код нової гілки з описаними оновленнями з репозиторію проекту:

http://svn.riaforge.org/transfer/transfer/branches/pluggable_cache/

 

Як завжди, обговорити нововведення можна в групі transfer-dev.

 

Оригінальна публікація:  Sneak Peak: Transfer's new Plug-able Cache

 

Автор: Сергій Галашин | Опубліковано: 01.12.2009 о 21:12 | Категорії: ORM - Performance - Transfer -

 

Railo Tips: типи аргументів, відносні шляхи та згенеровані ключі

Працюючи над портуванням проекту під Railo стикаюся з різними особливостями роботи двигуна, котрі варто пам'ятати щоб не наступати на ці граблі надалі.

 

Спершу виникла проблема з nullable атрибутами в Transfer ORM. В моєму випадку NULL для поля з типом DATE зручно було використовувати для дати завершення строку дії рахунку. Для цього дефініція виглядала наступним чином:

<property name="expirationDate" type="date" column="exp_date" nullable="true" />

Тоді методи object.setExpirationDateNull() / object.getExpirationDateIsNull() давали потрібний результат.

Transfer зберігає NULL-дати в своєму особливому форматі (фактично, дата в далекому минулому), але при витягання NULL з бази все одно ColdFusion конвертував його в порожій рядок. Цей факт і став фатальним при передачі витягнутого значення сеттерові setExpirationDate(<date>).

Railo, на відміну від CF8, не бажає сприймати порожній рядок як коректну дату при передачі його аргументом функції.

Внаслідок цього довелося відмовитися від nullable атрибутів та трішки переробити спосіб відслідковування дат завершення строку.

 

UPDATE

Насправді, це виявилося проблемою коду, що взаємодіяв з Transfer. Бо несприйняття порожнього рядку є нормальним явищем для будь-якого CFML парсера.

 

Іншою проблемою стало використання наступного методу ініціалізації об'єкта:

variables.logBean = CreateObject("component", "model/LogBean").init( arguments.pageid, arguments.userid );

Такий відносний шлях не спрацював в Railo.

На щастя, динамічні мапінги в ньому працюють, тому я використав вже існуючий і переробив код наступним чином:

variables.logBean = CreateObject("component", "components.core.model.LogBean").init( arguments.pageid, arguments.userid );

 

Наостанок мене трохи розчарував той факт, що Railo не дістає останній доданий ключ в result запиту, зокрема для MySQL там не встановлюється GENERATED_KEY взагалі (додано 30.11.2009 -- виправлено!). В якості тимчасового рішення використав наступний спосіб:

<cflock name="#this.lockName#" type="exclusive" timeout="5">

    <!--- push bean into the db ---->
    <cfquery datasource="#variables.dsn#" name="qAddLogEvent" result="qResult">
        INSERT INTO #variables.tableLogCurrent#
            (id_page, id_user, log_type, log_message, log_detail, remote_ip, moment)
        VALUES
            (
             <cfqueryparam cfsqltype="cf_sql_integer" value="#logBean.getPageId()#" />,
             <cfqueryparam cfsqltype="cf_sql_integer" value="#logBean.getUserId()#" />,
             <cfqueryparam cfsqltype="cf_sql_char" value="#logBean.getLogType()#" />,
             <cfqueryparam cfsqltype="cf_sql_char" value="#logBean.getLogMessage()#" />,
             <cfqueryparam cfsqltype="cf_sql_char" value="#logBean.getLogDetail()#" />,
             <cfqueryparam cfsqltype="cf_sql_char" value="#logBean.getRemoteIp()#" />,
             <cfqueryparam cfsqltype="cf_sql_timestamp" value="#logBean.getMoment()#" />
            )
    </cfquery>

    <!--- this is a workaround for the engines not supporting GENERATED_KEY --->
    <cfif NOT StructKeyExists(qResult, "GENERATED_KEY")>

         <cfquery datasource="#variables.dsn#" name="qResult">
             SELECT LAST_INSERT_ID() AS GENERATED_KEY
         </cfquery>

    </cfif>

</cflock>

Хорошою ж новиною є те, що цей прикрий факт можна змінити. Для цього треба проголосувати у відповідному запитові Uservoice. Знаючи лояльність розробників я вірю, що потрібні зміни будуть доволі скоро.

 

Автор: Сергій Галашин | Опубліковано: 27.09.2009 о 18:03 | Категорії: MySQL - ORM - Railo - Subjective - Tips - Transfer -

 

Відповіді на поширені питання щодо ORM в ColdFusion 9

Теренс Райян (Terrence Ryan) відповідає на деякі поширені питання щодо ORM в CF9. Зокрема пояснює базову різницю між паттернами Data Mapper та Active Record, чому для ColdFusion було обрано саме паттерн перший з них та розкриває деякі особливості його реалізації.

Автор: Сергій Галашин | Опубліковано: 21.09.2009 о 14:02 | Категорії: Adobe - Blogs - ColdFusion 9 - ORM -

 

Статті про основи ORM/Hibernate в ColdFusion 9

Марк Мендел (Mark Mandel, compoundtheory.com) опублікував цикл статей, що висвітлюють основи ORM в Centaur.

 

Сподіваюся, на цьому етапі він не закінчить цю справу та продовжить висвітлювати цю перспективну та цікаву тему.

 

Автор: Сергій Галашин | Опубліковано: 10.08.2009 о 19:56 | Категорії: Blogs - ColdFusion 9 - Documentation - ORM -

 

Щодо швидкодії створення об'єктів

Минулого місяця тривала (й триває досі) хвиля дискусій, що були породжені появою ORM в CF9. Якщо бути точним, реалізацією ORM за допомогою CFC-об'єктів.

Багато хто з розробників піддав сумніву доцільність цього кроку, небезпідставно стверджуючи про те, що створення об'єктів в CF є витратним та повільним процесом, бо потребує ряду операцій та витрат, наприклад сама компонента та кожен метод є окремим Java об'єктом, створення областей видимості та ін. Докладніше про це питання можна прочитати ув одного з інженерів Adobe в замітці ColdFusion ORM and CFC Performance.

Нас же зараз цікавлять приклади та порівняння. Цією справою не полінувалися зайнятися кілька ентузіастів:

І показали вельми цікаві результати, зокрема здивувала значна перевага Railo. Зрозуміло, що це лише один з аспектів швидкодії, котрий сам по собі не може бути базою для висновків.

Зауважу також, що обговорення питання проходить в гілці Object creation performance in CF 9: any better?

Автор: Сергій Галашин | Опубліковано: 02.08.2009 о 13:43 | Категорії: ColdFusion 8 - ColdFusion 9 - Discussions - Links - Open BlueDragon - ORM - Performance - Railo -